一.
(1)javascript的宿主环境是web浏览器,浏览器环境需要提供一些接口
javascript引擎才是真正执行代码的地方,e.g V8,Javascript core
(2)Javascript的宿主环境是nodejs,对应引擎是V8
二.global this
this == window对象
(1)声明变量没有var/let -> 给全局的this添加或改改变属性值
(2)node环境中 REPL:交互的编程环境
- 执行js脚本,全局范围内this以一个空对象开始作为最高级的命名空间,this不等同于global
- 执行js脚本,用REPL执行一个脚本,用var声明一个变量不会将变量添加给this
执行js脚本,不用REPL执行一个脚本,用var声明一个变量会将变量添加给this
(和浏览器中一样) - 声明变量无var和let
||global对象|this|
|-|–|–|
|用REPL执行|有|无|
|直接执行|有|有| 浏览器 this == window,this最大
node
执行写好的:声明的变量不会自动添加到this,会自动添加global
一行行执行:global最大,global=this,声明的变量自动添加到this和global
三.function this
- 指代全局范围内this
- 严格 –> this变成undefined
- 调用函数前有new,this变成一个新值,this不等于global
- 绑定事件处理程序,this指代事件处理程序对应的对象 e.g button
四.prototype this
prototype:每一个函数都是函数对象,会自动获得一个特殊属性prototype;用new方法调用函数,可以用this访问给prototype赋的值
1
2
3Thing.prototype.foo = "bar"
var thing = new Thing
console.log(thing.foo) //"bar"实例中this是一个特殊对象,new之后会隐藏同名属性
- 从一个function中new的实例,会共享所有的prototype赋值
- 可形成原型链,this会一层一层寻值
Thing1.prototype.foo = “bar”
Thing2.prototype = new Thing1
原型链中重新赋值,就会隐藏本身的值 - 嵌套函数 中的this没有继承 –> undefined
把一个实例的方法当成一个值,把值当成函数参数传给另一个函数,但不把实例传给这个函数
–> 环境变为全局global 把this捕捉到变量里 self (改变undefined)
1
2
3
4Thing.prototype.logFoo = function(){
var self = this
//可调用self.foo
}把一个方法作为一个值传递给一个函数无效
1
2
3
4function doItIndirectly(method) {
method()
}
doItIndirectly(thing.logFoo) //logs undefined使用bind解决
1
doItIndirectly(thing.logFoo.bind(thing)) //logs bar
使用apply和call解决
1
2
3Thing.prototype.logFoo = function () {
doIt.apply(this)
}用Object.create(Thing.prototype)替换new
五.object this
- 用apply将function绑定到var obj上
- 只有有相同直接父元素的属性才能通过this共享变量,即元素嵌套不可以
- 嵌套后可以直接用obj.foo调用
六.DOM event this
HTML DOM事件处理程序里,this始终指向DOM节点
七.HTML this
八.重写this
不可override
九.with this
with 将this添加到当前环境
Thing.prototype.logFoo = function () {
with(this) {
}
}
十.jQuery this
this指向HTML元素节点
e.g $( ).each