指定严格模式 "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
// fn 给module.exports添加了 name 属性, 值为 fn.call
fn.call(this, "fn.call");
console.log(module.exports.name); // fn.call
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"]);
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