关于JavaScript中this的指向问题,在chrome控制器和node环境中的不同表现?

function foo() {
    var a = 2;
    this.bar();
}

function bar() {
    console.log( this.a );
}

foo(); //undefined

这段代码在chrome控制台执行的时候,不会报错,是可以执行的。
但是在node环境中,是直接报错“TypeError: this.bar is not a function”。
请问,这种情况该如何有效的理解?

阅读 2.7k
6 个回答

确实不是严格模式的问题,之前回答有误
经过测试,题主代码运行在非严格模块内才会产生题主所说的错误提示。
此时this指向的是module.exports,在函数内定义的未导出的function都不会挂载在module.exports上

node的this指向的不是window而是global

在浏览器中:

function foo() {
    var a = 2;
    this.bar();
}

function bar() {
    console.log( this.a );
}

实际为:

window.foo = function() {
    var a = 2;
    window.bar();
}

window.bar = function() {
    console.log( window.a );
}

在NODE中:

function foo() {
    var a = 2;
    this.bar();
}

function bar() {
    console.log( this.a );
}

实际为:

function foo() {
    var a = 2;
    global.bar();
}

function bar() {
    console.log( global.a );
}

解释如下:
全局中的this指向的是module.exports
在函数中this指向的是global对象
具体请查看链接

说个毛线 如果node默认严格模式还要 'use strict' 干嘛, this指向 严格模式和普通模式是有区别的


node运行一下两段代码比较一下或许可以帮你:

'use strict'
function fn() {
    console.log(this === global)
    console.log(this)   // this 是 undefined
}
let obj = {name: 'obj'}

fn()
fn.call(obj)
// 'use strict'
function fn() {
    console.log(this === global)     // true  false 
}
let obj = {name: 'obj'}

fn()
fn.call(obj)
严格模式报错能是这报错?
TypeError: this.bar is not a function
node 默认是严格? 给我一个学习的机会 文档给我附上来

this在node中
全局this 指向module.exports
函数体内this 指向 global 俩者并非同一个对象 可以亲自测试一下

node的this,指向global试试

推荐问题
宣传栏