JavaScript this的指向和原理
程序员文章站
2024-02-08 21:43:34
...
1. this指向什么
先给出结论:函数内部的this指向的是此函数的调用者。
例子:
var primit = 'window环境'
var obj = {
primit:'obj环境',
foo:function(){
console.log(this)
console.log(this.primit)
}
}
var foo = obj.foo
obj.foo() //输出“obj环境”
foo() //输出“window环境”
控制台输出:
分析:
foo和obj.foo作为引用类型的地址都指向了存储在栈中的foo函数。obj.foo()执行时,obj是foo函数的调用者,输出obj的环境(上下文);foo()执行时,相当于执行window.foo(),此时window是foo函数的调用者,输出了window的环境。
2. 为构造函数调用时this指向情况
例子:
var primit = 'window环境', newEnvir
var obj = {
primit:'obj环境',
foo:function(){
this.primit='新对象环境'
console.log(this)
newEnvir = this
}
}
var foo1 = new obj.foo()
console.log(foo1===newEnvir) //true
控制台输出:
分析:
在var obj = new M()
中,new关键字一共做了三件事:
- 创建空的简单JavaScript对象(
即{}
) - obj继承M的prototype(
obj.__ proto__ = M.prototype
) - M的this指向obj,并执行M的函数体(
执行M.call(obj)
) - 返回新对象obj
根据new的作用,foo1作为obj.foo的调用者(new的过程中obj.foo()执行),此时obj.foo内部的this指向新对象foo1
3. 为什么this指向其调用者
JavaScript的数据是存储在栈内存和堆内存中的。
例子:
var obj = {
aaa: '',
fff: function(){}
}
这个obj对象在内存的存储情况如下图
obj作为基本数据类型存储在栈中,其值时存储在堆中的引用数据类型对象{aaa:'',fff:function(){}}
的地址。
函数也是存储在栈中的,作为独立的值,在内部的任何的任何操作都和obj没关系,在堆内存的对象的方法fff本质也是指向在栈中的函数的地址,可以通过obj.fff访问函数。
函数作为单独的值,可以在任何不同的环境(上下文)执行。js允许函数内部访问当前环境的环境变量,
但是访问的前提是需要知道当前处于什么环境,此时this就起着告知函数当前的运行环境的作用,这是设计this的目的。
推荐阅读
-
JavaScript this的指向和原理
-
javascript中对象的定义、使用以及对象和原型链操作小结
-
jquery和javascript的区别(常用方法教程比较)
-
java变量和javascript变量之间的传递示例
-
JavaScript使用递归和循环实现阶乘的实例代码
-
linux磁盘管理软RAID的实现原理分析和方法分享
-
PHP内存缓存技术memcached 的安装和工作原理介绍_PHP教程
-
JavaScript语法和变量 Ajax和JavaScript的区别
-
关于spring,IOC和AOP的解析原理和举例 springiocaop
-
求PHP实现javascript escape和unescape方法的代码