三者在js中修改作用域很重要
普通使用方法:
var xw = {
name : "小王",
gender : "男",
age : 24,
say : function() {
consol.log(this.name + " , " + this.gender + " ,今年" + this.age);
}
}
var xh = {
name : "小红",
gender : "女",
age : 18
}
xw.say();
第一次执行毋庸置疑结果: 小王 , 男 ,今年24
第二次执行 xw.say.call(xh)
:小红,女,18岁
第三次 xw.say.apply(xh)
: 小红,女,18岁
第四次:xw.say.bind(xh)()
: 小红,女,18岁
总结:call
、apply
作用一样都是作用于函数身上,但是bind**
返回的还是函数,需要单独调用。
再修改,查看传递参数区别:
var xw = {
name : "小王",
gender : "男",
age : 24,
say : function(school,grade) {
alert(this.name + " , " + this.gender + " ,今年" + this.age + " ,在" + school + "上" + grade);
}
}
var xh = {
name : "小红",
gender : "女",
age : 18
}
第一次调用:xw.say.call(xh,'北京二小',‘一年级’)
执行结果是:小红 北京二小 今年 18岁
第一次调用:xw.say.apply(xh,['北京二小',‘一年级’])
执行结果是:小红 北京二小 今年 18岁
第三次调用:xw.say.bind(xh)('通渭三中','高三年级')
执行结果是: 小红 通渭三中 高中二年级 18岁
总结: cal
l, apply
,bind
三者 调用参数凡是不一样
2018 年九月 百度商业部 一道作用域的面试题:
var name = 'anikin'
var obj = {
name:'jack',
show: function(){
console.log(this.name)
},
all:{
name:'rose',
showname: function(){
console.log(this.name)
}
}
}
1:var a = obj.all.showname
a() // anikin
2: obj.show() // jack
3: obj.all.showname.call(obj) // jack
4: obj.call.showname.call() // anikin
难度不大。主要是考察基本作用域的使用