记录今天在学习 FUNCTION#APPLY #CALL #BING 偶然遇到的一个之前没有注意到的问题。
我将其成为对象中的函数作用于问题, 确切的说,对象中函数的this 指向问题。
我尝试执行以下代码:
let name = 'jay';
let age = 25;
let obj = {
name: "tom",
age: 28,
func: function() {
console.log(this.name, '--', this.age);
}
}
obj.func.call(null)//undefined -- undefined
这段代码中,我在测试通过call
将一个函数对象中的 函数 this
在call
首个参数(即传入的this) 不指向时,应当默认指向全局作用域的场景。 结果遇到了输出并不是期望的:
jay -- 25
(在浏览器环境下 能取到 name='jay'
,age=25
。)但是在Node中执行结果为undefined
。
这就很奇怪了 - -
后来在MDN上再看了一下文档。 发现漏掉了这一句:
注意:在严格模式下,
this
的值将会是undefined
。见下文。请注意,
this
可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为null
或undefined
时会自动替换为指向全局对象,原始值会被包装。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/call
而Node 中,默认是以严格模式执行的,因此, Node中取不到,但是浏览器环境下能取到,验证方法也很简单,加上"use strict" 在浏览器中跑一下就知道了,我是了一下确实如此。
另外,我发现, 通过let
和var
关键字,在这段代码中,也会有不同的表现。
同在浏览器,非严格模式下, 使用var
关键字能够取到,但是通过let
关键字则取不到。
出现这样的情况,在《高程》 中也找到了解释:
所有通过
var
定义的全局变量和函数都会成为window对象的属性和方法。 使用let
和const
的顶级声明不会定义在全局上下文中。@《高级程序设计 4.2 - paragraph 2》