Javascript:函数范围的对象

时间:2018-08-18 15:17:39

标签: javascript

在JavaScript中,当我们在全局范围中定义一个像>> l1 = [1,2,3,2,1,2,3] >> l2 = [1,2,3] >> print(numpy.correlate(a=l1, v=l2)) >> print(scipy.signal.correlate(in1=l1, in2=l2)) [14 14 10 10 14] [ 3 8 14 14 10 10 14 8 3] # the first 3 is [0,0,1]dot[1,2,3] 这样的新变量时,该变量在浏览器中变成了像 window 这样的全局对象属性,因此我们可以通过{{1 }},例如,对于任何对象或数组属性var a = true;window.a;都是相同的。

即使函数本身作为对象,我们也可以在函数对象myObj.property;内定义属性。

但是当我们在这种情况下使用 var let 在函数内声明变量时,

myArr[0];

v 变量是什么的属性?我认为它可能被定义为函数对象本身或构造函数内部的不可枚举属性,但是当我使用function foo(){}; foo.prop = value;时我找不到它们,那么这些变量应该是属性吗?还是不应该这样,它们只是内存中的变量而没有任何对象的属性?

4 个答案:

答案 0 :(得分:2)

在全局范围内声明变量(即var a = 'hello')并通过全局对象(在浏览器中为window)可以访问它不是“正常”的事实声明变量时的行为。

“或者它们不应该是变量,它们只是内存中的变量,而不是任何对象的属性?” -这是正确的。

话虽如此,当不使用严格模式时(即,将'use strict'放在脚本顶部),如果您在不带var(或{ {1}}等),它也可以通过全局对象访问。例如:

let

以上之所以可行,是因为JavaScript解释器会遍历该功能可访问的所有作用域层,试图查找声明了 function setGlobal() { shouldNotBeGlobal = 'but it is!'; } setGlobal(); console.log(window.shouldNotBeGlobal) // "but it is!" 的位置,从而设置新的shouldNotBeGlobal值。但是,它永远不会找到该变量,然后决定在全局范围内为您创建该变量并将其创建。

这不起作用:

"but it is!"

通常来说,在函数中声明变量时,会创建一个新的执行上下文,因此在该范围内创建的变量仅在该范围内可用。它们不会成为任何对象的“一部分”。

答案 1 :(得分:1)

调用该函数时,将启动一个新的上下文。函数范围中定义的变量是该上下文的一部分。在函数外部无法访问它们,除非函数返回引用该变量的某些对象。

这些变量不可访问是一件好事,因为它避免了污染全局空间。

答案 2 :(得分:0)

此v变量是什么的属性?

简单地创建私有变量v,它不是foo的属性

每次编写foo.v = 123时,您都在创建foo的静态属性

答案 3 :(得分:0)

实际上v是一个标识符,它的评估结果是一个引用,其引用为EnvironmentRecord,并且仅在调用函数时创建,并且只能在函数内部访问。