非严格模式下JavaScript语句中“this”默认指向全局对象(window)
请阅读以下代码
该代码在浏览器中执行,输出的日志结果是什么?
obj.log.call(console,this) = console.log(this)。
this这里指window,所以最后的表达式是 console.log(window)
这道题看似在考this的绑定问题,实际上是通过this绑定为幌子,考察非严格模式下JavaScript语句中“this”默认指向全局对象(window)。
题目的关键点在第3行,我们知道,this绑定的优先级是new>bind>call(apply)>obj.func()>默认绑定。也就是说obj.log.call(console, this)语句中,实际上log函数内的this实际上指代的是console(这也是本题最大的陷阱!)。
然而实际上这一语句中obj.log.call(console, this)这一语句中打印的this是在外部传进去的,和函数内的this对象根本没有关系!也就是说此时log函数内的this指代console,但是打印的是从外面传进去的this对象,也就是window!
为了证明这一点,读者朋友们可以把obj.log.call(console, this)中的console改成任意一个对象,然后在非严格模式下执行,会发现结果都是window。
非严格模式下JavaScript语句中“this”默认指向全局对象(window)。其实严格模式下上面代码也是指向全局对象(window),只是在普通函数内部的this才不会指向window。
function goodboy(){console.log(this);}
goodboy();
这种情况下的this才会受"use strict"的干扰
obj.log和console.log指向同一个函数, 使用obj.log.call(console)其实就是调用console.log()。 console.log(message)接受参数message并打印 obj.log.call(console, this)与console.log(this)相同,而在全局作用域下这个this为window!
全局执行环境中this 都指向全局对象;
在函数内部,this的值取决于函数被调用的方式。
let obj = {}
// example1
function fn(e){
console.log('传参',e) // 传参 window{}
console.log('内部',this) // 内部 {}
}
fn.call(obj, this)
// example2
let o = {
foo:function(){
function fn(e){
console.log('传参',e) // 传参 {foo: ƒ}
console.log('内部',this) // 内部 {}
}
fn.call(obj,this)
}
}
o.foo()
fn(e){}
1、this作为参数传入fn执行时取决于当前执行函数的执行上下文
2、fn函数内部的this才受call绑定影响。
obj.log = console.log
obj.log.call(console,this)等于console.log.call(console,this)等于console.log(this)
关于这个this的指向问题,我一开始以为是console,但是出来的结果是Window,可以尝试通过下面的代码理解
function test(mingzi){
this.name = mingzi;
this.check = function(){
console.log(this);
}
}
new test('小明').check();
上文中的代码通过check方法执行console.log(this),输出的是当前对象test,那么如果在JS中直接输出this呢?
这个this指向的对象是什么呢?答案就是Window。使用chrome的同学可以尝试在F12 console里面直接输入this,指向的正是Window
obj.log = console.log;//在本行中obj对象中创建了一个函数(即console.log)的引用log,因为是个这个函数的引用如果想要执行可以有两种方法,第一种是后边加(),第二种是使用apply()或者call(),二者第一个参数都是this,接下来的参数apply是参数数组或者是"arguments",而call的参数是直接的参数值
obj.log.call(console,this);//如上所述,call的第二个参数是要被传入obj.log()的参数,这行代码其实可等价于console.log(this),而因为这三行代码都是在浏览器环境下定义的(不是函数中的局部变量),所以this就是window.
__EOF__

本文链接:https://www.cnblogs.com/longmo666/p/17817514.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律