“又是关于闭包的疑问,比较高级的疑问”的结论,有ECMA的理论依据,也恳请cloudgamer来审阅一下 本帖最后由 ykl4452 于 2009-11-13 23:33:51 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 11.2.3 请再往下看到this段落 - -! 难道闭包时 this指向了作用域链的最顶端? “闭包中的this指向window”这个结论很简单,也很容易记忆,但是背后的原理却不是那么简单的,我贴这个帖子主要是确定一下"背后的原理" 阿q一下 还记得闭包中循环变量的问题吗 内层函数调用的循环变量都是其最终值 ,因为内层函数的作用是是在其定义是确定的,也就是外层函数执行的时候。所以是最终值。而this可以不以这样理解。抛砖引玉~~~ 我在你上一个帖子里回复到:希望你看一下这部分,Cloudgamer也跟你提到过,不过貌似你却没去看这里。 看来楼主对函数理解不深入啊函数有作用域,还有调用对象,作用域问题是一个链式,一层一层往外找,这个看来你已经知道了在你的例子中, 没有指明谁调用fn,那么就是 window调用了,我稍微改了一下你的代码,希望你能理解吧 var outwrap = function(){ var fn = function(){ //结果是[object Window] alert(this); }; fn(); fn.call(this); this.test = fn; this.test(); }; var o = new outwrap(); to dh20156:冤枉啊,这段我绝对有看,可是和这个的应用场合不太一样在执行outwrap构造函数的时候,执行fn(). 首先,在执行构造函数outwrap()的时候,他内部的this指向谁??毫无疑问,是outwrap的实例对象o,那么按理来说,fn()的调用者——构造函数outwrap(),应该会把this的值传递给fn(),可是没有。换句话说,此时的this应该指向outwrap的实例对象o,可是实际却不是如此。这也是令我非常疑惑的地方,也是10.2.3章节无法解释的,所以才会有这篇帖子和之前那片帖子 是你不理解,类似this.test和fn看似都是相同的方法,但是对于this的解释是截然不同的,不能混为一谈 你调用fn.call(this); 已经破坏了我的本意,我的本意是想说:fn()内部的this应该指向实例对象o,但实际不是这样,这是为什么呢?因为fn()的调用者——outwrap()构造函数,把null作为this的值传递给fn()。那么更进一步的说,为什么构造函数outwrap()会把null作为this的值传递给fn(),答案就是我在一楼贴的内容 我给你加了三句话fn.call(this); this.test = fn; this.test(); 用了两种方式显式指明调用对象,函数的this只跟调用对象有关,跟作用域无关,如果没有显式指定调用对象,那么就是windows.你的fn没有显式指明调用对象,那么就是windows函数里面的变量分为两种,this.xxx 或是 xxx, 前一种会去调用对象找,后一种会去作用域找 http://blog.csdn.net/xiaofan_sap/archive/2009/10/15/4677394.aspx看看这篇文章 jquery1.8跟1.3的兼容问题 Ext 高手请进 SOS js控制表格 我做的进度条怎么不能同步啊,高手请帮我看看 怎么获得选定的区域? 新手请教:.focus() 到底有什么用? 请问不用window.open和window.location如何打开连接?急 可拖拽表单.还有缺陷,望高手指点 请高手指教一下,这个页面右侧的菜单是如何实现的? 白菜求教: 做个js脚本,想在网页上的输入框中换行回车,要怎么写的? 如何一个动作激发多个事件 javascript 设置字体 长度 高度
函数有作用域,还有调用对象,作用域问题是一个链式,一层一层往外找,这个看来你已经知道了在你的例子中, 没有指明谁调用fn,那么就是 window调用了,我稍微改了一下你的代码,希望你能理解吧 var outwrap = function(){
var fn = function(){
//结果是[object Window]
alert(this);
};
fn();
fn.call(this);
this.test = fn;
this.test();
};
var o = new outwrap();
在执行outwrap构造函数的时候,执行fn().
首先,在执行构造函数outwrap()的时候,他内部的this指向谁??毫无疑问,是outwrap的实例对象o,
那么按理来说,fn()的调用者——构造函数outwrap(),应该会把this的值传递给fn(),可是没有。
换句话说,此时的this应该指向outwrap的实例对象o,可是实际却不是如此。这也是令我非常疑惑的地方,也是10.2.3章节无法解释的,所以才会有这篇帖子和之前那片帖子
我给你加了三句话
fn.call(this); this.test = fn;
this.test(); 用了两种方式显式指明调用对象,函数的this只跟调用对象有关,跟作用域无关,如果没有显式指定调用对象,那么就是windows.你的fn没有显式指明调用对象,那么就是windows函数里面的变量分为两种,this.xxx 或是 xxx, 前一种会去调用对象找,后一种会去作用域找
看看这篇文章