非严格模式下,为什么this都指向window??
function fn(){
console.log(this);
}
var oo={
sum:function(){
fn();
}
}
oo.sum();
var o = oo.sum
o()
题目来源及自己的思路
不是说看函数值前面是否有”.“么?
有点”.“,this指向调用函数那个
没有指向window
有点蒙逼啊
非严格模式下,为什么this都指向window??
function fn(){
console.log(this);
}
var oo={
sum:function(){
fn();
}
}
oo.sum();
var o = oo.sum
o()
不是说看函数值前面是否有”.“么?
有点”.“,this指向调用函数那个
没有指向window
有点蒙逼啊
你可以这样写
var obj = {
var1: 'obj',
fn1: function(){
console.log(this)
}
}
obj.fn1()
// 此时this就指向了obj这个对象
在JavaScript中
this 代表运行时当前对象的引用
看你的代码,运行环境应该是在浏览器中(JS也能在NodeJS的环境中运行)
那么你sum方法里面对fn的调用是直接调用,直接调用不管你是在函数里面,还是在全局环境下,永远是windows
你看下这段代码,可以复制到控制台运行下,node环境会有不同的结果
console.log(this);
var obj = {
fn: function(){
console.log(this);
}
};
obj.fn();
let fn = obj.fn;
fn();
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
稍微帮你把这段代码梳理一下:
上面简单把语句注明作用从问题来看,题主应该对于函数内部this的指向有所疑惑。
由于在js中,this的指向与函数被调用的方式直接相关,所以只要了解了函数有哪些调用情况会改变this,那么我们就能很好地阅读代码时判断this指向。
我声明的函数fn会有哪些调用方式呢?
正常情况我们直接
fn()
调用, 内部this指向运行环境的全局对象(在浏览器中就是window对象,在node环境中就是global对象);注意:而题主在方法sum内部就是这么调用的,所以不管你是怎么调用sum,而fn函数的调用方式没有发生变化,所以fn内部的this指向就不会发生变化。一个变种,我们将fn赋值给一个变量,正常调用情况的另一种形式,比如说
但当我们将fn赋值给一个对象属性,方法调用,比如说
我们给fn显式的指明this;
当我们把fn当成构造函数来用的时候,this指向新创建的实例对象
对于sum方法来说,
上面就是能够改变this的指向的4种情况,希望上述总结对题主有所帮助。