this有关
程序员文章站
2022-07-13 11:35:06
...
问答
理解this
this不是编写时绑定,而是运行时绑定。它依赖于函数调用的上下文条件。this绑定和函数声明的位置无关,反而和函数被调用的方式有关。
函数是和new一起被调用的吗(new绑定)?如果是,this就是新构建的对象。
var bar = new foo()
函数是用call或apply被调用(明确绑定),甚至是隐藏在bind 硬绑定 之中吗?如果是,this就是明确指定的对象。
var bar = foo.call( obj2 )
函数是用环境对象(也称为拥有者或容器对象)被调用的吗(隐含绑定)?如果是,this就是那个环境对象。
var bar = obj1.foo()
否则,使用默认的this(默认绑定)。如果在strict mode下,就是undefined,否则是global对象。
var bar = foo()
以上,就是理解对于普通的函数调用来说的this绑定规则所需的全部。是的···几乎是全部。
???? apply、call有什么作用,什么区别。
- apply()和call()函数都可以指定this值和参数值的情况下调用某个函数。
- call()和apply()的作用一样,区别在于提供给原函数的参数的方式不一样
- apply()函数数只接受两个参数,提供给原函数的参数以数组或类数组对象的形式存在
- call()接收无限个参数, 第二个参数及其后面的参数就是提供给原函数的参数。
代码
- 下面代码输出什么,为什么
var john = {
firstName: "John"
}
function func() {
alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi() // ⬅️输出John:hi!
- 下面代码输出什么,为什么
func() ⬅️ //输出window对象
function func() {
alert(this)
}
因为是全局变量调用函数
- 下面代码输出什么,为什么
function fn0(){
function fn(){
console.log(this); ⬅️ //输出window对象
}
fn();
}
fn0();
document.addEventListener('click', function(e){
console.log(this);⬅️ //输出document对象因为document调用
setTimeout(function(){
console.log(this);⬅️ //输出window对象
}, 200);
}, false);
- 下面代码输出什么,why?
var john = {
firstName: "John"
}
function func() {
alert( this.firstName )
}
func.call(john)
通过call()函数调用,此时this为John对象,输出"John"
- 下面代码输出什么,为什么
var john = {
firstName: "John",
surname: "Smith"
}
function func(a, b) {
alert( this[a] + ' ' + this[b] )
}
func.call(john, 'firstName', 'surname')
弹出 john smith
。
因为 call方法可以接收 参数列表。
- 以下代码有什么问题,如何修改
var module= {
bind: function(){
$btn.on('click', function(){
console.log(this) //this指的是$btn
this.showMsg();
})
},
showMsg: function(){
console.log('饥人谷');
}
}
改为
var module= {
bind: function(){
var me = this; ⬅️ 存在变量中
$btn.on('click', function(){
console.log(this)
me.showMsg(); ⬅️ 再调用
})
},
showMsg: function(){
console.log('饥人谷');
}
}
this资料
本文版权归作者_Josh和饥人谷所有,转载请注明来源