关于JavaScript闭包中this对象(colsure)
来源:互联网 发布:道路照明计算软件 编辑:程序博客网 时间:2024/05/24 11:15
我们知道,
this对象是运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。《Javascript高级程序设计》
在下面的例子中,理解闭包中的this对象。
var name = "The Window";var object = { name: "My object", getNameFunc: function() { return function() { return this.name; }; }}alert(object.getNameFunc()()); // "The Window"
为什么最后的结果是"The Window"而不是object里面的name"My object"呢?
首先,要理解函数作为函数调用和函数作为方法调用。
我们把最后的一句拆成两个步骤执行:
var first = object.getNameFunc();var second = first();
其中第一步,获得的first为返回的匿名函数,此时的getNameFunc()作为object的方法调用,如果在getNameFunc()中使用this,此时的this指向的是object对象。
第二部,调用first函数,可以很清楚的发现,此时调用first函数,first函数没有在对象中调用,因此是作为函数调用的,是在全局作用域下,因此first函数中的this指向的是window。
再看下面这句话:
为什么匿名函数没有取得其包含作用域(外部作用域)的this对象呢?
每个函数被调用时,其活动对象都会自动取得两个特殊变量:this和arguments。内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。 《Javascript高级程序设计》
那么,如何获得外部作用域中的this呢?
可以把外部作用域中的this保存在闭包可以访问到的变量里。如下:
var name = "The Window";var object = { name: "My object", getNameFunc: function() { var that = this; // 将getNameFunc()的this保存在that变量中 var age = 15; return function() { return that.name; }; }}alert(object.getNameFunc()()); // "My object"
其中,getNameFunc()执行时的活动对象有:that/age/匿名函数,在执行匿名函数时,同时引用了getNameFunc()中的活动对象,因此可以获取that和age的值。访问age时直接return age,不能用 reutrn this.age。因为这时的this指向window。但是由于是在全局环境中调用的匿名函数,因此匿名函数内部的this还是指向window
- 关于JavaScript闭包中this对象(colsure)
- JavaScript 关于this对象
- 关于javascript闭包中的this对象
- javascript在闭包中使用this对象
- Javascript对象中关于setTimeout和setInterval的this介绍
- [JAVASCRIPT] this 对象
- javascript 中 this 对象
- javascript this 对象详解
- javascript-this对象指代
- JavaScript 理解this对象
- JavaScript之this对象
- JavaScript 的this对象
- Javascript this对象
- javaScript 上下文this 对象
- 【javascript】javascript对象中的this
- 关于JavaScript的this
- 关于JavaScript中的this
- 关于javascript的this
- 160. Intersection of Two Linked Lists
- module + 异常
- Caffe2源码理解系列之IO
- 64. Minimum Path Sum
- Spring报错java.lang.IllegalStateException: BeanFactory not initialized or already closed -call 'refres
- 关于JavaScript闭包中this对象(colsure)
- 用GAN来做图像生成,这是最好的方法
- Android:JNI 与 NDK到底是什么?(含实例教学)
- 彻底解决Webpack打包性能问题
- VTK学习(十六)三角剖分
- 圆、长方形的面积和周长
- 用Leangoo管理你的项目
- [LeetCode]310. Minimum Height Trees
- 机器学习笔记之R语言基础篇1