號
for循環的行爲而由於你混淆兩件事情:
函數的參數是函數的局部(用大「除非」,保存爲2號)
它們旨在以您選擇的任何名稱爲函數的作用域別名一個對象(包括數組/函數)或值。
目標是允許您將參數重命名爲任何您想要的內容,以使內部代碼變得有意義,而不管您從外部代碼傳入的參數是什麼。
這與範圍無關。
JS中的變量通過引用傳遞(如果它們是對象),如果它們是標量,則通過值傳遞。
傳遞i
到一個新的封閉的整點是,值i
被作爲參數傳遞,而不是參考到i
,這是發生了什麼,如果你不要」 t包括關閉。
如果你要傳遞一個對象,該對象是什麼了就可以了i
(obj.i += 1
),然後再次關閉與否,每個功能將指向的i
相同的值,因爲他們」 d都與同一個對象共享相同的參考。
對象由參考通過,標量由值通過。
儘管技術上有字符串和數字對象,但只要您沒有對它們進行任何面向對象的操作,它們就會直接轉換爲標量值。
var i = 3,
say_i = function() { console.log(i); };
與
var i = 3,
say_i = (function (val) { return function() { console.log(val); }(i));
第一個給出了一個參考到i
。
當say_i
運行時,它實時查看i
的值,並將其吐出到控制檯中。
第二個已通過一個值到返回的函數的外範圍,別名爲名稱val
。
由於數字是按值傳遞的,而不是通過引用,所以val
將永遠等於相同的東西,除非從裏面改變。
你也可以做到這一點相同的結果,如果你犯了一個功能一次,循環外:
var add_log = function (el, val) { el.onclick = function() { console.log(val); }; },
i = 0,
el;
for (; i < ........) {
el = ....
add_log(el, i);
}
i
正在按值傳遞的,因此,所有的元素將在其範圍表中的不同val
因此,每個元素都會記錄一個不同的數字。
參數num從不更新,它是每個調用的新變量。 – bfavaretto 2013-04-07 16:06:25