指定 “use strict“ 后 js 里的 this 

指定严格模式  "use strict"; 后

 

如果没指定函数里的this,this不再指向 globle

function fn(name) {
  this.name = name
}

let f1 = new fn('wjs'); // 执行后 f1.name 的值为 wjs
let f2 = fn('wjs');     // 忘了加new 报错 this未定义

// 这里的 this 指向 module.exports, 传给 fn 后
// fn 里的this 也指向了 module.exports
// fn 给module.exports添加了 name 属性, 值为 fn.call
fn.call(this, "fn.call"); 
console.log(module.exports.name); // fn.call

 

forEach 调用回调时没有指定this, 因此function回调 需要显式指定 this

let wjs = {
  name:"wjs",
  
  talk(names){
    // =>回调 没有this, 于是this就使用了wjs的
    names.forEach(e => console.log(this.name, e));

    // function回调中的this 要显式指定,否则为 undefine
    let self = this
    names.forEach(function (e) { console.log(self.name, e); });
  },
}
wjs.talk(["wjl","wsh"]);

 

events 调用回调时指定了 this, 指定为EventEmitter 

const EE = require('events');

const ee = new EE();

// =>回调 没有this, 所以忽略了 ee的指定, =>中的 this 就是外层的 this, 此处即module.exports
ee.on('close', (...args) => {console.log(this, ...args);} )

// function回调,接受了 ee指定的EventEmitter
ee.on('close', function(...args) {console.log(this, ...args);} )

ee.emit('close', "this", "is", "message");

 

附录, 完整示例代码 

"use strict";

function fn(name) {
  this.name = name
}

let f1 = new fn('wjs'); // 执行后 f1.name 的值为 wjs
//let f2 = fn('wjs');     // 忘了加new 报错 this未定义

// 这里的 this 指向 module.exports 传给 fn 后
// fn 里的this 也指向了 module.exports
// 给module.exports添加了 name 属性, 值为 fn.call
fn.call(this, "fn.call"); 
console.log(module.exports.name); // fn.call

let wjs = {
  name:"wjs",
  
  talk(names){
    // => 和 function的区别, => 没有this, 于是this就使用了wjs的
    // foreach callback 的 this undefine  语法错误
    names.forEach(e => console.log(this.name, e));
    
    let self = this
    names.forEach(function (e) { console.log(self.name, e); });
  },
}
wjs.talk(["wjl","wsh"]);


const EE = require('events');

const ee = new EE();

ee.on('close', (...args) => {console.log(this, ...args);} )
ee.on('close', function(...args) {console.log(this, ...args);} )

ee.emit('close', "this", "is", "message");

 

输出

fn.call
wjs wjl
wjs wsh
wjs wjl
wjs wsh
{ name: 'fn.call' } this is message
EventEmitter {
  _events: [Object: null prototype] { close: [ [Function], [Function] ] },
  _eventsCount: 1,
  _maxListeners: undefined,
  [Symbol(kCapture)]: false
} this is message

 

你可能感兴趣的:(js)