1. var關鍵字聲明的變數的範圍是整個函數.
var bar = 'global';function foo () { console.log(bar); // ==> undefined var bar = 'local'; console.log(bar); // ==> local}foo();
按照我們的想法, 第一行應該列印global才對. 但是, 事實上, 因為var的範圍是整個函數, 而不是只作用於其後的內容, 所以,我們的函數定義其實和下面的這個定義是等價的
function foo () { var bar; console.log(bar); bar = 'local'; console.log(bar);}
這件事請告訴我們, 最好把var語句都放在函數的頂部, 這樣可以避免不必要的誤解, 以便增加程式的可讀性.
ps:
function foo () { for (var s=0, i=0; i<10; i++) { for (var j=0; j<10; j++) { s = i*j; } } console.log(s); // ==> 81}foo();
以上代碼中, s是在for迴圈內產生的,但並不妨礙它的範圍, 它的範圍還是整個函數.
2. 範圍鏈
待
3. || 運算子
|| 的求解順序是從左至右的. 並且, 如果左邊的值為真, 那麼整個式子的值就一定是真了. 因此它不會再向右求解.
比如
var i = 1;i || ++i;console.log(i); // ==> 1++i || i;console.log(i); // ==> 2
在對 i || ++i 這個運算式求值時, 系統會從左至右求解, 因此會先看到i, i為1, 轉換成布爾值為真. 因此整個運算式的值為真, 也因此, 不會再執行++i.
|| 運算式還有一個特徵, 它返回的值不一定是真或者假, 而是構成運算式的因子的值. 看代碼你就明白了.
console.log(42 || [1,2]); // ==> 42
實際上, || 運算子完全等價於以下函數
function _or_ (a, b) { if (a) { return a; } else { return b; }}
我知道你不相信,但是你可以實驗一下.
於是我們的一些代碼就可以寫的比較順暢了. 比如預設參數, 要達到我們的目的可以這樣寫:
function sayTo(who) { if (!who) { who = 'Xiaochi'; } ...}
但有更簡潔也更易讀的方式:
function sayTo(who) { who = who || 'Xiaochi'; ...}
ps:
&& 運算子就相當於
function _and_ (a, b) { if (a) return b; else return a;}
4. 數組的length可寫
給數組的length賦值, 如果值小於當前值, 將會切斷數組, 如果大於當前值, 將會擴充數組.
我不知道這個知識點有什麼用...
var a = [1];a.push(23);console.log(a); // ==> [1, 23]a.length = 5;console.log(a); // ==> [1, 23, undefined, undefined, undefined]
5. 將參數轉化為數組
有的時候希望將函數轉化為數組對象, 這樣就可以利用數組對象的各種方便的方法了.方式如下:
var argsArray = [].slice.apply(arguments);