一、普通函数调用(默认绑定)
// 非严格模式 var name = ‘window‘; var doSth = function(){ console.log(this.name); } doSth(); // ‘window‘
window.doSth并不是调用的才指向window,而是因为上述代码在ES5中,全局变量是挂载在顶层对象的(浏览器是window),但若改为ES6,则结果不同。
let name = ‘window‘; let doSth = function(){ console.log(this === window); console.log(this.name); } doSth(); // true undefinded
let没有给顶层对象中(浏览器是window)添加属性,window.name和window.doSth都是undefined。
当使用严格模式的时候,普通函数的this则不同,表现为undefined。
// 严格模式 ‘use strict‘ var name = ‘window‘; var doSth = function(){ console.log(typeof this === ‘undefined‘); console.log(this.name); } doSth(); // true,// 报错,因为this是undefined
上述表现即是默认绑定 可在《你不知道的JavaScript》中查阅。
二、对象中的方法调用模式
var name = ‘window‘; var doSth = function(){ console.log(this.name); } var student = { name: ‘恒若‘, doSth: doSth, other: { name: ‘other‘, doSth: doSth, } } student.doSth(); // ‘恒若‘ student.other.doSth(); // ‘other‘ // 用call类比则为: student.doSth.call(student); // 用call类比则为: student.other.doSth.call(other);
若将对象中的函数赋值成一个变量,则会变成普通函数(默认绑定)
var studentDoSth = student.doSth; studentDoSth(); // ‘window‘ // 用call类比则为: studentDoSth.call(undefined);
未完待续...
原文:https://www.cnblogs.com/hengruo/p/11964115.html