學習《JavaScript經(jīng)典實例》之第1~3章

《JavaScript經(jīng)典實例》各節(jié)中的完整代碼解決了常見的編程問題墅茉,并且給出了在任何瀏覽器中構(gòu)建Web應用程序的技術(shù)昧甘。只需要將這些代碼示例復制并粘貼到你自己的項目中就行了良拼,可以快速完成工作,并且在此過程中學習JavaScript的很多知識充边。

第1章 JavaScript不只是簡單的構(gòu)件塊

1.1 JavaScript對象庸推、基本類型和字面值之間的區(qū)別

  • 5種基本類型:字符串常侦、數(shù)值、布爾值贬媒、null聋亡、undefined,有3個有對應的構(gòu)造方法對象:string际乘、Number坡倔、Boolean

  • 基本類型變量嚴格等于字面值,而對象實例則不會脖含,因為基本類型是按值來比較的罪塔,而值是字面值

var num1 = 123;
var num2 = new Number(123);
console.log(typeof num1);  //number 
console.log(typeof num2);  //object

1.2 從字符串提取一個列表

  • 提取之前:This is a list of items: cherries, limes, oranges, apples.
  • 提取之后:['cherries','limes','oranges','apples']
  • indexOf() 方法可返回某個指定的字符串值在字符串中首次出現(xiàn)的位置。
  • substring() 方法用于提取字符串中介于兩個指定下標之間的字符养葵。
  • split() 方法用于把一個字符串分割成字符串數(shù)組征堪。
var sentence = 'This is one sentence. This is a sentence with a list of items: cherries, oranges, apples, bananas. That was the list of items.';
var start = sentence.indexOf(':');
var end = sentence.indexOf('.', start+1);
var listStr = sentence.substring(start+1, end);
var fruits = listStr.split(',');
console.log(fruits);  //[" cherries", " oranges", " apples", " bananas"]

//取出空格等
fruits.forEach(function(elmnt,indx,arry) {
    arry[indx] = elmnt.trim();
});
console.log(fruits);  //["cherries", "oranges", "apples", "bananas"]

1.3 檢查一個存在的、非空的字符串

  • 想要驗證一個變量已經(jīng)定義了港柜,是一個字符串请契,并且它不為空
if(typeof unknowVariable === 'string' && unknowVariable.length > 0) {...}

1.4 插入特殊字符

  • 想要向字符串中插入一個特殊字符,例如一個換行
  • 轉(zhuǎn)義序列都以一個反斜杠 開始(\)

1.5 使用新字符串替換模式

  • 使用String對象的replace方法和一個 正則表達式
  • replace() 方法用于在字符串中用一些字符替換另一些字符夏醉,或替換一個與正則表達式匹配的子串爽锥。

正則表達式特殊字符

字符 匹配 例子
^ 匹配輸入的開頭 /^This/ 匹配This is...
$ 匹配輸入的結(jié)束 /end$/ 匹配This is the end
* 匹配0次或多次 /se*/ 匹配s seeee或se
? 匹配0次或1次 /ap?/ 匹配apple and and
+ 匹配1次或多次 /ap+/ 匹配apple 但是不匹配and
{n} 嚴格匹配n次 /ap{2}/ 嚴格匹配apple 但是不匹配apie
{n,} 匹配n次或多次 /ap{2,}/ 匹配apple中的p,但是不匹配apie中的p
{n,m} 至少匹配n次畔柔,之多匹配m
除換行以外的任何字符
/ap{2,4}/ 匹配apppppple中的4個p
/a.e/ 匹配ape和axe
[...] 方括號中的任何字符 /a[px]e/ 匹配ape axe 但是不匹配apxe
[^...] 除了方括號以外的任何字符 /a[^px]/ 匹配ale 但是不匹配ape axe
\b 匹配單詞邊界 /\bno/ 匹配nono中的第一個no
\B 匹配非單詞邊界 /\Bno/ 匹配nono中的第二個no
\d 數(shù)字0到9 /\d{3}/ 匹配Now in 123 中的123
\D 匹配任何非數(shù)字字符 /\D{2,4}/ 匹配Now in 123 中的Now in
\w 匹配任何單詞字符(字母氯夷、數(shù)組和下劃線 /\w/ 匹配javaScript中的j
\W 匹配任何非單詞字符(非字母、數(shù)組和下劃線) /\W/ 匹配100%中的%
\n 匹配一個換行
\s 一個單個的空白字符
\S 一個單個的非空白字符
\t 一個制表符
(x) 捕獲括號 記住匹配的字符
var searchString = "Now is the time, this is the tame";
var re = /t\w{2}e/g;
var replacement = searchString.replace(re, 'place');
console.log(replacement);  //Now is the place, this is the place

1.6 找到并突出顯示一個模式的所有實例

  • RegExp exec() 方法用于檢索字符串中的正則表達式的匹配
  • RegExpObject.exec(string)
  • 返回一個數(shù)組靶擦,其中存放匹配的結(jié)果腮考。如果未找到匹配,則返回值為 null
var searchString2 = "Now is the time and this is the time and that is the time";
var parttern = /t\w*e/g;  //\w 匹配任何單詞字符
var matchArray;

var str = "";

//用regexp exec檢查模式玄捕,如果不為空踩蔚,處理它
while((matchArray = parttern.exec(searchString2)) != null) {
    str += "at " + matchArray.index + " we found " + matchArray[0] + "\n";
}
console.log(str);
// at 7 we found the
// at 11 we found time
// at 28 we found the
// at 32 we found time
// at 49 we found the
// at 53 we found time
//實例1-1
document.getElementById("searchSubmit").onclick = function() {

    //獲取模式
    var pattern = document.getElementById("pattern").value;
    var re = new RegExp(pattern, "g");
    //獲取字符串
    var searchString = document.getElementById("inComing").value;
    
    var matchArray;
    var resultString = "<pre>";
    var first = 0;
    var last = 0;
    
    //找到每一個匹配
    while((matchArray = re.exec(searchString)) != null) {
        last = matchArray.index;
    
        //獲取所有匹配的字符串,將其連接起來
        resultString += searchString.substring(first, last);
    
        //使用class枚粘,添加匹配的字符串
        resultString += '<span class="found">' + matchArray[0] + '</span>';
        first = re.lastIndex;
    }
    
    //完成字符串
    resultString += searchString.substring(first, searchString.length);
    resultString += "</pre>";
    
    //插入頁面
    document.getElementById("searchResult").innerHTML = resultString;

}

1.7 使用捕獲圓括號交換一個字符串中的單詞

  • 交換名稱馅闽,讓姓氏先出現(xiàn)
  • 解決:使用捕獲圓括號和一個正則表達式在字符串中找到并記住他們的名字,然后互換他們
  • replace() 方法用于在字符串中用一些字符替換另一些字符馍迄,或替換一個與正則表達式匹配的子串福也。
字符 替換文本
1、2攀圈、...暴凑、$99 與 regexp 中的第 1 到第 99 個子表達式相匹配的文本。
$& 與 regexp 相匹配的子串赘来。
$` 位于匹配子串左側(cè)的文本现喳。
$' 位于匹配子串右側(cè)的文本凯傲。
$$ 允許替換中有一個字面值美元符號($)
$n 插入使用RegExp的第n次捕獲圓括號的值
var myName = "Tao Yang";
var nameRe = /^(\w+)\s(\w+)$/;
var myNewName = myName.replace(nameRe, "$2 $1");
console.log(myNewName);  //Yang Tao

1.8 使用命名實體來替代HTML標簽

  • 使用正則表達式把尖括號(<>)轉(zhuǎn)換為命名的實體:<和>
var pieceOfHtml = "<p>This is a <span>paragraph</span></p>";
pieceOfHtml = pieceOfHtml.replace(/</g, "&lt;");
pieceOfHtml = pieceOfHtml.replace(/>/g, "&gt;");
console.log(pieceOfHtml); //&lt;p&gt;This is a &lt;span&gt;paragraph&lt;/span&gt;&lt;/p&gt;

1.9 ISO 8610格式的日期轉(zhuǎn)換為Date對象可接受的一種形式

var dtstr = "2014-3-04T19:35:32Z";
dtstr = dtstr.replace(/\D/g, " ");
console.log(dtstr);  //2014 3 04 19 35 32
var dtcomps = dtstr.split(" ");
//在基于1的ISO 8610月份和基于0的日期格式之間轉(zhuǎn)換
dtcomps[1]--;

var convdt = new Date(Date.UTC.apply(null, dtcomps));
console.log(convdt.toString());  //Wed Mar 05 2014 03:35:32 GMT+0800 (中國標準時間)

1.10 使用帶有定時器的函數(shù)閉包

  • 使用一個匿名函數(shù)作為setInterval()或setTimeout()方法調(diào)用的第一個參數(shù)
var intervalId = null;
document.getElementById("redbox").addEventListener('click', startBox, false);
function startBox() {
    if(intervalId == null) {
        var x = 100;
        intervalId = setInterval(function() {
            x += 5;
            var left = x + "px";
            document.getElementById("redbox").style.left = left;
        }, 500);
    } else {
        clearInterval(intervalId);
        intervalId = null;
    }
}

1.11 記錄兩個事件之間消耗的時間

  • 在第一個事件發(fā)生的時候,創(chuàng)建一個Date對象拿穴,當?shù)诙€時間發(fā)生的時候泣洞,創(chuàng)建一個新的Date對象,并且從第二個對象中減去第一個對象默色。兩者之間的差以毫秒表示的球凰,要轉(zhuǎn)換為秒,就除以1000
  • 兩個日期可以相減腿宰,但是相加就成了拼接字符串
var firstDate = new Date();
setTimeout(function() {
    doEvent(firstDate);
}, 25000);

function doEvent() {
    var secondDate = new Date();
    var diff = secondDate - firstDate;
    console.log(diff);   //25001
}

1.12 十進制數(shù)轉(zhuǎn)化為十六進制值

var num = 255;
console.log(num.toString(16));  //ff

1.13 想要將表中一列的所有數(shù)字加和

  • 遍歷表中包含了數(shù)字值的列呕诉,將其轉(zhuǎn)換為數(shù)字,并加和
  • querySelector() 方法返回文檔中匹配指定 CSS 選擇器的一個元素
  • 如果你需要返回所有的元素吃度,請使用 querySelectorAll() 方法替代
  • 全局函數(shù) parseInt()parseFloat() 都把字符串轉(zhuǎn)化為數(shù)字
var sum = 0;
//使用querySelectorAll找到第二列的所有單元格
var cells = document.querySelectorAll("td:nth-of-type(2)");
for(var i=0, l=cells.length; i<l; i++) {
    sum += parseFloat(cells[i].firstChild.data);
}

1.14 在角度和弧度之間轉(zhuǎn)換

  • 將角度轉(zhuǎn)換為弧度
var radians = degrees * (Math.PI / 180);

  • 將弧度轉(zhuǎn)化為角度
var degrees = radians * (180 / Math.PI);

1.15 找到頁面元素可容納的一個圓的半徑和圓心

  • Math.min(x,y)方法可返回指定的數(shù)字中帶有最低值的數(shù)字甩挫。
  • 求出寬度和高度中較小的一個,用其除以2得到半徑
var circleRadius = Math.min(elemengWidth, elemengHeight) / 2;
  • 給指定頁面元素的寬度椿每、高度伊者,通過將二者都除以2來找到其中心點
var x = elemengWidth / 2;
var y = elemengHeight / 2;
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>將一個SVG圓放入到一個div元素中</title>
    <style type="text/css">
        #elem {
            width: 100%;
            height: 500px;
            border: 1px solid #ddd;
            background-color: #ddd;
        }
    </style>
</head>
<body>

    <div id="elem">
        <svg width="100%" height="100%">
            <circle id="circ" width="10" height="10" r="10" fill="#f90">
        </svg>
    </div>


    <script type="text/javascript">
    window.onload = window.onresize = function() {
        var box = document.getElementById("elem");
        var style = window.getComputedStyle(box, null);
        var width = parseInt(style.getPropertyValue("width"));
        var height = parseInt(style.getPropertyValue("height"));
        console.log('w', width, 'h', height);
        var x = width / 2;
        var y = height / 2;

        var circleRadius = Math.min(width, height) / 2;

        var circ = document.getElementById("circ");
        circ.setAttribute("r", circleRadius);
        circ.setAttribute("cx", x);
        circ.setAttribute("cy", y);
        console.log('r', circleRadius, ' cx', x, ' cy', y);
    }
    </script>
</body>
</html>

1.16 計算圓弧的長度

  • 給定了一個圓的半徑及圓弧角的角度值亦渗,求該圓弧的長度
  • 使用Math.PI把角度轉(zhuǎn)換為弧度,并在公式中使用該結(jié)果來求得圓弧的長度
var radians = degrees * (Math.PI / 180);
var arclength = radians * radians;

第2章 JavaScript數(shù)組

2.1 在數(shù)組中搜索

  • indexOf()汁尺、lastIndexOf()
var animals = new Array('dog', 'cat', 'seal', 'elephant', 'walrus', 'lion');
var index = animals.indexOf('cat');
var index2 = animals.lastIndexOf('lion');
console.log('i',index);  //1
console.log('i2',index2);  //5
  • findIndex() 方法返回傳入一個測試條件(函數(shù))符合條件的數(shù)組第一個元素位置法精。
var nums = [2, 4, 199, 80, 400, 30, 90];
var over = nums.findIndex(function(ele) {
    return (ele >= 100);
});
console.log('nums',nums[over]);  //199

2.2 用concat()和apply()將一個二維數(shù)組扁平化

  • concat() 方法用于連接兩個或多個數(shù)組。該方法不會改變現(xiàn)有的數(shù)組痴突,而僅僅會返回被連接數(shù)組的一個副本搂蜓。
    • arrayObject.concat(arrayX,arrayX,......,arrayX)
var fruitarray = [];
fruitarray[0] = ['stranwberry', 'orange'];
fruitarray[1] = ['lime', 'peach', 'banana'];
fruitarray[2] = ['tangerine', 'apricot'];
console.log('array',fruitarray.concat());
var newArray = fruitarray.concat.apply([], fruitarray);
console.log(newArray);
function add(a, b) {
    console.log('add', this);
}
function sum(a, b) {
    console.log('sum', this);
}
add(1, 2);  //Window
sum(1, 2);  //Window

add.call(sum, 1, 2);  //sum(a, b)
sum.call(add, 1, 2);  //add(a ,b)
  • arguments裝換為數(shù)組, 返回的是數(shù)組帮碰,但是arguments本身保持不變
var arg = [].slice.call(arguments);
// [].slice.call(document.getElementsByTagName('li'));
  • 借用別人的方法
var foo = {
    name: 'jack',
    showName: function() {
        console.log('this name:',this.name);
    }
}
var bar = {
    name: 'rose'
}
foo.showName();  //jack
foo.showName.call(bar);  //rose
  • 實現(xiàn)繼承
var Student = function(name, age, high) {
    Person.call(this, name, age);
    this.high = high;
}
  • 封裝對象保證this的指向
var _this = this;
_this.$box.on('mousedown', function()) {
    return _this.fndown.apply(_this);
}

2.3 刪除或替換數(shù)組元素

  • splice() 方法與 slice() 方法的作用是不同的,splice() 方法會直接對數(shù)組進行修改拾积。
var animals = new Array('dog', 'cat', 'rabbit', 'pig', 'apple');
// 從數(shù)組刪除元素
animals.splice(animals.indexOf('apple'), 1);
console.log(animals);  // ["dog", "cat", "rabbit", "pig"]
// 替換
animals.splice(animals.indexOf('pig'), 1, 'monkey');
console.log(animals);  //["dog", "cat", "rabbit", "monkey"]

// 使用循環(huán)和分割來替換和刪除元素
var charSets = ["ab", "bb", "cd", "ab", "cc", "ab", "dd", "ab"];
while(charSets.indexOf('ab') != -1) {
    charSets.splice(charSets.indexOf('ab'), 1, '**');
}
console.log(charSets);  //["**", "bb", "cd", "**", "cc", "**", "dd", "**"]
while(charSets.indexOf('**') != -1) {
    charSets.splice(charSets.indexOf('**'), 1);
}
console.log(charSets); //["bb", "cd", "cc", "dd"]

2.4 提取一個數(shù)組中的一部分

  • 不更改原數(shù)組收毫,使用slice()
var animals = new Array('dog', 'cat', 'rabbit', 'pig', 'apple');
var newAnimals = animals.slice(1, 2);
console.log(animals);  //["dog", "cat", "rabbit", "pig", "apple"]
console.log(newAnimals);  //["cat"]

2.5 對每一個數(shù)組元素應用一個函數(shù)

var charSets = ["ab", "bb", "cd", "ab", "cc", "ab", "dd", "ab"];
charSets.forEach(function(element, index, array) {
    if(element == 'ab') array[index] = '**';
});
console.log(charSets);  //["**", "bb", "cd", "**", "cc", "**", "dd", "**"]

2.6 使用forEach()和call()遍歷querySelectorAll()的結(jié)果

var cells = document.querySelectorAll('td + td');
[].forEach.call(cells, function(cell) {
    sum += parseFloat(cell.firstChild.data);
});

2.7 對數(shù)組中的每個元素執(zhí)行一個函數(shù)并返回一個新數(shù)組

  • 將一個十進制的數(shù)組轉(zhuǎn)化為新的等價的十六進制數(shù)組
  • map()方法創(chuàng)建一個新數(shù)組,其結(jié)果是該數(shù)組中的每個元素都調(diào)用一個提供的函數(shù)后返回的結(jié)果殷勘。
  • 與forEach()不同,不會修改原數(shù)組昔搂,但是必須返回一個值
var decArray = [23, 3, 24, 45, 500, 9, 70];
var hexArray = decArray.map(function(ele) {
    return ele.toString(16);
});
console.log(decArray);  //[23, 3, 24, 45, 500, 9, 70]
console.log(hexArray);  //["17", "3", "18", "2d", "1f4", "9", "46"]

2.8 創(chuàng)建一個過濾后的數(shù)組

  • filter() 方法創(chuàng)建一個新數(shù)組, 其包含通過所提供函數(shù)實現(xiàn)的測試的所有元素玲销。
var charSet = ['**', 'bb', 'cc', '**', 'cd'];
var newArray = charSet.filter(function(element, index, array) {
    return element != "**";
});
console.log(newArray);  //["bb", "cc", "cd"]

2.9 驗證數(shù)組內(nèi)容

  • 使用Array every()方法來檢查每個元素是否符合給定的條件
  • some() 方法確保至少某些元素符合該條件
  • 區(qū)別:every()方法只要函數(shù)返回一個false值,處理就會結(jié)束摘符,而some()方法會繼續(xù)測試每個元素贤斜,直至返回true策吠,此時,不再驗證其他元素瘩绒,即可返回ture
function testValue(element, index, array) {
    var testExp = /^[a-zA-Z]+$/;
    return testExp.test(element);
}
var elemSet = ['**', 123, 'adv', '-', 45, 'AAA'];
var result = elemSet.every(testValue);
var result2 = elemSet.some(testValue);
console.log(result);  //false
console.log(result2);  //true

var elemSet2 = ['aaa', 'animals', 'vvv'];
result = elemSet2.every(testValue);
result2 = elemSet2.some(testValue);
console.log(result);  //true
console.log(result2);  //true

2.10 使用一個關(guān)聯(lián)數(shù)組來存儲表單元素名和值

  • keys() 方法返回一個新的Array迭代器猴抹,它包含數(shù)組中每個索引的鍵。
var elemArray = {};
var elem = document.forms[0].elements[0];
elemArray[elem.id] = elem.value;
var elemArray = {name: 'yt', age:25};
Object.keys(elemArray).forEach(function(key) {
    var value = elemArray[key];
    console.log(value);
});

第3章 JavaScript的構(gòu)建塊

3種基本的創(chuàng)建函數(shù)方式:

  • 聲明式函數(shù)
  • 匿名函數(shù)或函數(shù)構(gòu)造函數(shù)
  • 函數(shù)字面值或函數(shù)表達式

3.1 放置函數(shù)并提升

  • 聲明式函數(shù)锁荔,可以放置在代碼中的任何位置蟀给;函數(shù)表達式,必須將其放置在使用函數(shù)的位置之前
// 在聲明一個變量之前打印a
console.log('a', a);  //undefined
var a;
// 在聲明一個變量并賦值
console.log('aa', aa);  //undefined
var aa = 1;

// 聲明變量發(fā)生了提升阳堕,但是賦值并沒有跋理,賦值是在相應的位置發(fā)生的

// 聲明式函數(shù),在訪問該函數(shù)之前恬总,提升將確保把函數(shù)聲明移動到當前作用域的頂部
console.log(mytest());  //success
function mytest() {
    return 'success';
}
// 使用函數(shù)表達式就會報錯前普,變量可能聲明了,但沒有實例化壹堰,但是你的代碼試圖將這個變量當做一個函數(shù)對待
console.log(mytest2());  //TypeError: mytest2 is not a function
var mytest2 = function() {
    return 'success2';
}

3.2 把一個函數(shù)當做參數(shù)傳遞給另一個函數(shù)

function otherFunction(x, y, z) {
    x(y, z);
}
// 可以像傳遞一個命名的變量一樣拭卿,將一個函數(shù)作為參數(shù)傳遞給另一個函數(shù)
var param = function func(a1, a2) { alert(a1 + " " + a2); };
otherFunction(param, "Hello", "World");
  • 函數(shù)式編程和JavaScript
    • 高階函數(shù): 一個函數(shù)接受另一個函數(shù)作為參數(shù),或者返回一個函數(shù)贱纠,或者兩者都具備
    • 函數(shù)式編程: 對應用程序復雜性進行抽象的一種方式峻厚,使用整齊、干凈的函數(shù)調(diào)用替代了復雜的循環(huán)和條件語句(代碼可讀性高)
    • 比如:將數(shù)組中的所有數(shù)字相加
// for循環(huán)相加
var nums = [1, 34, 3, 15, 4, 18];
var sum = 0;
for(var i = 0; i < nums.length; i++) {
    sum += nums[i];
}
console.log('sum', sum);  //75

var nums2 = [1, 34, 3, 15, 4, 18];
var sum2 = nums2.reduce(function(n1, n2) {
    return n1 + n2;
});
console.log('sum2', sum2);  //75
  • arr.reduce([callback, initialValue]) 方法接收一個函數(shù)作為累加器(accumulator)并巍,數(shù)組中的每個值(從左到右)開始縮減目木,最終為一個值。

<h4 id="3-3">3.3 實現(xiàn)遞歸算法</h4>

  • 想要實現(xiàn)一個函數(shù)懊渡,它遞歸地遍歷一個數(shù)組并返回一個反向的數(shù)組字符串
  • 缺點:遞歸很消耗內(nèi)存
// 階乘
function factorial(n) {
    return n == 1 ? n : n * factorial(n - 1);
}
console.log('階乘', factorial(4));  // 24

// 斐波那契
var fibonacci = function(n) {
    return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
}
console.log('斐波那契', fibonacci(10));  //55

// 使用一個遞歸函數(shù)字面值來反轉(zhuǎn)數(shù)組元素刽射,從最大長度開始,每次迭代都將這個值自減
// 當為 0 時剃执,返回字符串
var reverseArrary = function(x, index, str) {
    return index == 0 ? str : reverseArrary(x, --index, (str += " " + x[index]));
}
var arr = ['apple', 'orange', 'peach', 'lime'];
var str = reverseArrary(arr, arr.length, "");
console.log('str', str);  //lime peach orange apple

// 如果要反過來誓禁,按照順序把數(shù)組連接為一個字符串
var orderArray = function(x, i, str) {
    return i == x.length - 1 ? str : orderArray(x, ++i, (str += x[i] + " "));
}

var numArr = [1, 2, 3, 4];
var numStr = orderArray(numArr, -1, "");
console.log('numStr', numStr);  //1 2 3 4 

3.4 使用一個定時器和回調(diào)防止代碼阻塞

  • 在程序的輸出中,3個外圍的 console.log() 立即被處理了
  • 隊列中下一個事件是第一個 noBlock() 函數(shù)調(diào)用肾档,其中又調(diào)用了 factorial() 摹恰,記錄了其運行時候的活動,最后跟著回調(diào)函數(shù)的調(diào)用
  • 第二次同樣地調(diào)用了 callBack()
  • 第三次調(diào)用 callBack() 的時候怒见,回調(diào)函數(shù)中的調(diào)用針對第一次 callBack() 俗慈,并使用了第一次函數(shù)調(diào)用的最終結(jié)果:6
<script type="text/javascript">
function factorial(n) {
    console.log('n', n);
    return n == 1 ? 1 : n * factorial(n - 1);
}
function noBlock(n, callback) {
    setTimeout(function() {
        var val = factorial(n);
        if(callback && typeof callback == 'function') {
            callback(val);
        }
    }, 0);
}
console.log('Top of the morning to you');
noBlock(3, function(n) {
    console.log('first call ends width ' + n);
    noBlock(n, function(m) {
        console.log('final result is ' + m);
    });
});

var tst = 0;
for(var i = 0; i < 10; i++) {
    tst += i;
}
console.log('value of tst is ' + tst);
noBlock(4, function(n) {
    console.log('end result is ' + n);
});
console.log('not doing too much');
</script>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市遣耍,隨后出現(xiàn)的幾起案子闺阱,更是在濱河造成了極大的恐慌,老刑警劉巖舵变,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酣溃,死亡現(xiàn)場離奇詭異瘦穆,居然都是意外死亡,警方通過查閱死者的電腦和手機赊豌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門扛或,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碘饼,你說我怎么就攤上這事熙兔。” “怎么了派昧?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵黔姜,是天一觀的道長。 經(jīng)常有香客問我蒂萎,道長秆吵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任五慈,我火速辦了婚禮纳寂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泻拦。我一直安慰自己毙芜,他們只是感情好,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布争拐。 她就那樣靜靜地躺著腋粥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪架曹。 梳的紋絲不亂的頭發(fā)上隘冲,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音绑雄,去河邊找鬼展辞。 笑死,一個胖子當著我的面吹牛万牺,可吹牛的內(nèi)容都是我干的罗珍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼脚粟,長吁一口氣:“原來是場噩夢啊……” “哼覆旱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起核无,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扣唱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體画舌,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年已慢,在試婚紗的時候發(fā)現(xiàn)自己被綠了曲聂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡佑惠,死狀恐怖朋腋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情膜楷,我是刑警寧澤旭咽,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站赌厅,受9級特大地震影響穷绵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜特愿,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一仲墨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧揍障,春花似錦目养、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兜畸,卻和暖如春努释,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膳叨。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工洽洁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人菲嘴。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓饿自,卻偏偏與公主長得像,于是被迫代替她去往敵國和親龄坪。 傳聞我的和親對象是個殘疾皇子昭雌,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 待繁花落盡又再次盛開 我亦不知流年何時再來 我在匆忙歲月中躲過紅塵靄靄 掌心中的瓔珞卻已蒙上塵埃 子夜花開烛卧,散去寒...
    南有喬木怎思清商閱讀 392評論 2 4
  • iOS 10撥打系統(tǒng)電話發(fā)現(xiàn)彈出框會延遲2s左右出現(xiàn),很不爽,研究了一下总放,發(fā)現(xiàn)是openURL在http://bl...
    Joh蝸牛閱讀 755評論 0 4
  • 對花如對人呈宇, 見花如見身。 生死邊上事局雄, 唯以生死了甥啄。 云冉冉,水燦燦炬搭, 明月蘆草舟泛遠蜈漓。
    何俊榮閱讀 625評論 0 0
  • 或許在我們心中融虽,都對那些優(yōu)秀的人心生向往。年少時懷著一份羞澀灼芭,不敢走近有额,遠遠的觀望就已足夠;慢慢長大后姿鸿,各自一方谆吴,...
    心里有很多事閱讀 381評論 0 0
  • 歌德曾說過,“在世界上發(fā)生的諸多災難中苛预,從未有過任何災難像龐貝一樣句狼,它帶給后人的是如此巨大的愉悅∪饶常” ...
    洪小兵閱讀 1,010評論 0 2