夜间模式CodeSnippetStyle:
日间模式CodeSnippetStyle:

0%


#FUNCTION#CALL对象中的函数内作用域问题.md

记录今天在学习 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 将一个函数对象中的 函数 thiscall首个参数(即传入的this) 不指向时,应当默认指向全局作用域的场景。 结果遇到了输出并不是期望的:

jay -- 25

(在浏览器环境下 能取到 name='jay',age=25 。)但是在Node中执行结果为undefined

这就很奇怪了 - -

后来在MDN上再看了一下文档。 发现漏掉了这一句:

注意:在严格模式下,this 的值将会是 undefined。见下文。

请注意,this可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为 nullundefined 时会自动替换为指向全局对象,原始值会被包装。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/call

而Node 中,默认是以严格模式执行的,因此, Node中取不到,但是浏览器环境下能取到,验证方法也很简单,加上"use strict" 在浏览器中跑一下就知道了,我是了一下确实如此。

另外,我发现, 通过letvar 关键字,在这段代码中,也会有不同的表现。
同在浏览器,非严格模式下, 使用var 关键字能够取到,但是通过let 关键字则取不到。

出现这样的情况,在《高程》 中也找到了解释:

所有通过var 定义的全局变量和函数都会成为window对象的属性和方法。 使用letconst 的顶级声明不会定义在全局上下文中。

@《高级程序设计 4.2 - paragraph 2》

本文关联文章为 :#浅析 JavaScript ES6 call(). apply(), bind()

posted @ 2021-04-19 20:59  暮冬有八  阅读(62)  评论(0编辑  收藏  举报
BACK TO TOP

😀迷海无灯听船行。Github WeChat