当你进行函数的嵌套时,要注意实际上作用域链是发生变化的,这点可能看起来不太直观。你可把下面的代码置入firebug监视值的变化。 嵌套的函数(作用域链) var testvar = 'window属性'; var o1 = {testvar:'1', fun:function(){alert('o1: '+this.testvar+'<<');}}; var o2 = {testvar:'2', fun:function(){alert('o2: '+this.testvar);}}; o1.fun();'1' o2.fun();'2' o1.fun.call(o2);'2'
var testvar = 'window属性'; var o3 = { testvar:'3', testvar2:'3**', fun:function(){ alert('o3: '+this.testvar);//'obj3' var inner = function(){ alert('o3-inner: '+this.testvar);//'window属性' alert('o3-inner: '+this.testvar2);//undefined(未定义) }; inner(); } }; o3.fun();
var i = 4; var j = 5; var k = 7; var fn = function(){ var i = 6; k = 8;//注意前面没有var 所以这句话的意思的把8赋予到变量k中去! alert(i);//6 alert(j);//5 alert(k+'-1');//8-1 x = 1;//这句的作用有两种情况,创建全部变量x或覆盖(overwrite)全部变量x }; fn(); alert(k+'-2');//8-2 (注意不是7-2)
var obj = { toString:function(){ return 'obj的范围内(作用域内)';}, //重写toString函数,方便执行console.log(this)时的输出 func: function(){ // 这里的函数直接从属与对象"object" console.log(this); var innerFunc = function(){ //n这里的函数不是特定对象的直接成员,只是另外一个函数的变量而已 console.log(this); }; innerFunc(); } }; obj.func(); // 输出 "obj的范围内(作用域内)" // 输出 "Window的一些相关内容..."
obj.func.call(window); // 输出 "Window的一些相关内容..." // 输出 "Window的一些相关内容..."
var obj = { toString:function(){ return 'obj的范围内(作用域内)';}, //重写toString函数,方便执行console.log(this)时的输出 func: function(){ // 这里的函数直接从属与对象"object" console.log(this); var innerFunc = function(){ //n这里的函数不是特定对象的直接成员,只是另外一个函数的变量而已 console.log(this); }; innerFunc.call(this); } }; obj.func(); // 输出 "obj的范围内(作用域内)" // 输出 "obj的范围内(作用域内)"
var obj = { toString:function(){ return 'obj的范围内(作用域内)';}, //重写toString函数,方便执行console.log(this)时的输出 func: function(){ // 这里的函数直接从属与对象"object" console.log(this); var innerFunc = function(){ //n这里的函数不是特定对象的直接成员,只是另外一个函数的变量而已 console.log(this); }; innerFunc = innerFunc.createDelegate(this); // 这里我们用委托的函数覆盖了原函数。 innerFunc(); // 按照一般的写法调用函数 } }; obj.func(); // 输出 "obj的范围内(作用域内)" // 输出 "obj的范围内(作用域内)"
varsDs.load({callback: function(records){ col_length = varsDs.getCount();//这里的varDs离开了作用域? //col_length = this.getCount();//这个this等于store吗? for (var x = 0; x < col_length; x++) { colarray[x] = varsDs.getAt(x).get('hex'); } }});不过可以写得更清晰: var obj = { callback: function(records){ col_length = varsDs.getCount();//这里的varDs离开了作用域? //col_length = this.getCount();//这个this等于store吗? // ... } };
... load : function(config) { var o = {}; o.callback = config.callback; //进行加载 o.callback(); } ...
|