js闭包中this指向的问题

问题描述

下面是百度今年的一个笔试题:var myObject = {foo:"bar",func: function() {var self = this;console.log("outer func: this.foo = " + this.foo);console.log("outer func: self.foo = " + self.foo); (function (){ console.log("inner func: this.foo = " + this.foo); console.log("inner func: self.foo = " + self.foo); }());}}myObject.func();结果是 bar bar undefined bar关于第三个undefined我是这样理解的:func是myObject对象的属性方法,所以其内部this指向myObject对象本身。而此属性方法内部的匿名立即执行函数是独立的,其this指向自身的执行上下文,引用不到外部的foo,所以是undefined。但由于作用域链使用self可以通过self引用到外部,所以第四个是bar。我是这样理解的,并且我做了个推论:function outer(){this.i = 10;alert(this.i);(function(){alert(this.i);}());};outer();按道理第二次弹出对话框是undefined才对,可是它却是10!它这里怎么又能通过this引用外部的i了呢?why?请大神不吝赐教!

解决方案

两个this都是指window.function outer(){this.i = 10;alert(this === window)alert(this.i);(function(){alert(this.i);alert(this === window)}());};outer();想要出现undefined,改成new outer();
解决方案二:
function outer(){ console.log(this); (function(){ console.log(this); }()); };用这种方法自己尝试一下就出来了,拿到支持console的浏览器里面跑一下就出来了。
解决方案三:
匿名函数都是window对象的,window都没有foo。自身的执行上下文,这样说根本没说到点上。
解决方案四:
任务而温热我认为二位
解决方案五:
你怎么不想想this指向的是哪?除了对象本身和window还能指向什么?所以你第二段代码2个this指向的都是window

时间: 2024-09-20 06:17:36

js闭包中this指向的问题的相关文章

浅谈JS闭包中的循环绑定处理程序_基础知识

前几天工作中写前端js代码时,遇到了遍历元素给它添加单击事件.就是这个问题让我整整调了一个下午.最后还是下班回家,上网查资料才知道怎么解决的. (PS:之前也在<jQuery基础教程>第四版中看过讲循环绑定处理程序的内容,当时估计也没怎么用心看,所以没记起来.) 大神要是知道这类情况,可以关掉窗口,写这些主要是给像我一样的小白看的.谢谢! 先贴上错误的例子让大家看看.(例子里面用到jQuery,请导入jQuery库) 复制代码 代码如下: <!DOCTYPE html PUBLIC &q

js 闭包 和this 指向

问题描述 什么是js 闭包 ,有什么作用? 在往上查询了一下,还是不知道,请大家指教? 很多时候不知道this指向到底是指什么? 解决方案 http://www.iteye.com/topic/1118705感觉这篇帖子也许会对提问者有些帮助.解决方案二:你始终记着 this 是调用这个方法的对象的引用, 谁调用的这个方法就是谁解决方案三:(//code//...// ...//this 指的就是()内的这个对象)();//最后这个括号相当于调用这个方法...里面的东西对外都是不见的

JS闭包中的循环绑定处理程序

前几天工作中写前端js代码时,遇到了遍历元素给它添加单击事件.就是这个问题让 我整整调了一个下午.最后还是下班回家,上网查资料才知道怎么解决的. (PS:之前也在<jQuery基础教程>第四版中看过讲循环绑定处理程序的内 容,当时估计也没怎么用心看,所以没记起来.) 大神要是知道这类情况,可以关掉窗口,写这些主要是给像我一样的小白看的.谢谢!  先贴上错误的例子让大家看看.(例子里面用到jQuery,请导入jQuery库) <!DOCTYPE html PUBLIC "-//W

浅谈js 闭包引起的内存泄露问题

  这篇文章主要介绍了浅谈js 闭包引起的内存泄露问题的相关资料,需要的朋友可以参考下 在js闭包中,可以定义"局部变量",但是外部去调用的话,尤其是反复调用赋值,会造成内存的大量开销.如何防止这种现象的发生?关于闭包还有没有类似的内存或效率问题需要注意?如何去规避? 内存问题可能是如下原因造成: 1. 循环引用导致了内存泄漏 2. 由外部函数调用引起的内存泄漏 避免内存泄漏 1. 打破循环引用 2. 添加另一个闭包 3. 避免闭包自身 以上所述就是本文的全部内容了,希望大家能够喜欢.

浅谈js 闭包引起的内存泄露问题_javascript技巧

在js闭包中,可以定义"局部变量",但是外部去调用的话,尤其是反复调用赋值,会造成内存的大量开销.如何防止这种现象的发生?关于闭包还有没有类似的内存或效率问题需要注意?如何去规避? 内存问题可能是如下原因造成: 1. 循环引用导致了内存泄漏 2. 由外部函数调用引起的内存泄漏 避免内存泄漏 1. 打破循环引用 2. 添加另一个闭包 3. 避免闭包自身 以上所述就是本文的全部内容了,希望大家能够喜欢.

深入理解js闭包

深入理解js闭包 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码

干货分享:让你分分钟学会JS闭包

1.闭包,一睹为快 在接触一个新技术的时候,我首先会做的一件事就是找它的 demo.对于我们来说,看代码比自然语言更能理解一个事物的本质.其实,闭包无处不在,比如:jQuery.zepto的核心代码都包含在一个大的闭包中,所以下面我先写一个最简单最原始的闭包,以便让你在大脑里产生闭包的画面: function A(){      function B(){         console.log("Hello Closure!");      }      return B;  } 

JS闭包、作用域链、垃圾回收、内存泄露相关知识小结_javascript技巧

补充: 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的特性 闭包有三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变量不会被垃圾回收机制回收 闭包的定义及其优缺点 闭包 是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量 闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露. 闭包是javascript

javascript深入理解js闭包_javascript技巧

一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function f1(){ var n=999; } alert(n); // error 这里有一个地方需要注意,函数