//
範例
2.1
在函數內保存數據
var obj = new Object();
var events = { m1: "clicked", m2: "changed" };
for (e in events) {
obj[e] = function( aValue) { // 閉包 lv1
return function() { // 閉包lv2
alert(events[ aValue]);
}
}(e);
}
//
範例
2.2
在閉包內經過局部變量保存數據
for (e in events) {
function() { // 閉包lv1
var aValue = e;
obj[e] = function() { // 閉包lv2
alert(events[ aValue]);
}
}();
(obj[e] = function() {
// arguments.callee 指向匿名函數自身
alert(events[arguments.callee .aValue]);
}
) .aValue = e;
//
範例
2.4
Function構造器
var obj = new Object();
var events = {m1: "clicked", m2: "changed"};
for (e in events) {
obj[e] = new Function('alert( events["' + e + '"])');//
變量e被轉換爲字符串值來使
用
}
七、優先級:argsName(形式參數名) > arguments > funcName(函數名),其中arguments 是語言內定的標識符,無需聲明便可使用。
// 示例1:輸出值'hi', 而非函數foo.toString()
function foo(foo) {
alert(foo);
}
foo('hi');
// 示例2:輸出數值100 的類型'number', 而非參數對象arguments 的類型'object'
function foo2(arguments) {
alert(typeof arguments);
}
foo2(100);
// 示例3:輸出參數對象arguments 的類型'object'
// (注:在JScript 中, arguments 做爲函數名能夠被聲明, 但調用該函數致使腳本引擎崩潰)
function arguments () {
alert(typeof arguments);
}
arguments ();
八、局部變量 (varDecls)與函數形式參數:
A.
當形式參數名與未賦值的局部變量名重複時
,
取形式參數值;
B.
當形式參數與有值的局部變量名重複時,取局部變量值。
第一種狀況:
function myFunc(str){
var str;
alert(str);
}
myFunc("not undefined");
//not undefined
function myFun(str){
var str = "hello world";
alert(str);
}
myFun("not undefined");
//hello world
九、使用Function()構造器建立的函數與函數直接量聲明、匿名函數不一樣,它在任意位置建立的實例,都處於全局閉包中。亦便是說, Function()的實例的upvalue 老是指向全局閉包。
var value = "hello world";
function myFunc(arg){
var value = "welcome to here";
var foo = new Function('alert(value)');
foo();
}
myFunc(); //
"hello world"
十、對象閉包:
var aObj = { value: 'hello' };
function foo() {
with (aObj) { // < --對象閉包
var value = 1000;