为什么';我的javascript函数不会抛出错误吗?

为什么';我的javascript函数不会抛出错误吗?,javascript,function,global-variables,evaluate,window-object,Javascript,Function,Global Variables,Evaluate,Window Object,在调用我的函数之后,我惊讶地发现我的函数没有抛出一个错误,因为有一个变量&使用一个未在函数范围内定义的变量 我的问题: 为什么我的函数不抛出一个未定义的错误或类似的错误?它不应该抛出一个错误,因为“长度”不在函数的参数中吗?我知道,如果我将“长度”切换为“高度”,它将起作用 如果有人能解释javascript是如何一步一步地解释这个函数的,这会对我有所帮助。这是我的密码: function areaRectangle(width, height) { aRectangle = width

在调用我的函数之后,我惊讶地发现我的函数没有抛出一个错误,因为有一个变量&使用一个未在函数范围内定义的变量

我的问题: 为什么我的函数不抛出一个未定义的错误或类似的错误?它不应该抛出一个错误,因为“长度”不在函数的参数中吗?我知道,如果我将“长度”切换为“高度”,它将起作用

如果有人能解释javascript是如何一步一步地解释这个函数的,这会对我有所帮助。这是我的密码:

function areaRectangle(width, height) {
   aRectangle = width * length;
   console.log("The area of the rectangle is: " + aRectangle);
}
areaRectangle(10, 7); # The area of the rectangle is: 0

因为它使用的不是参数或变量,而是恰好为0的属性。

您没有在函数内部本地定义长度变量。因此,当您调用此函数时,它会查找其父范围以查找长度变量的值

假设该函数是在全局范围内定义的,那么它将向上查看window对象以查找length的值。在本例中,这将是window.length,它指的是当前窗口中iframe的数量。您可以阅读有关window.length的更多信息:

也就是说,我们可以通过修改原始函数来解决这个问题。由于您的函数试图计算矩形的面积,我们需要修改原始函数,以便它使用两个参数计算距离。我建议采取以下措施:

function areaRectangle(width, height) {
  aRectangle = width * height; // notice we changed the second variable to height
  console.log("The area of the rectangle is: " + aRectangle);
}
areaRectangle(10, 7); // This will result in 70.

这取决于在哪个环境中执行此函数

如果在浏览器中执行此操作,则全局上下文中似乎有一个计算结果为数值的length属性。当您在控制台中执行函数并尝试访问长度时,由于函数中未定义长度,JavaScript引擎将在全局上下文中查找长度变量(因为闭包)


如果在节点中执行此操作,您会注意到会抛出错误,因为节点中的全局上下文没有length属性。

如果在当前代码块中未声明最接近的父作用域变量,则会访问该变量,因此当您参考
length
时,如果不存在声明的变量,则在大多数执行环境中,它将解析为全局范围。在浏览器中,上下文是
window
,因此您实际上是在引用
window.length

意识到答案有点复杂,下面是一个如何解析为局部或父范围变量的示例

如果你这样做了


var length=“马铃薯”;
功能区域矩形(宽度、高度){
A角=宽度*长度;
log(“矩形区域为:“+aRectangle”);
}
面积矩形(10,7);//我的号码是0

length
源自
window.length
,它是一个定义给定窗口上下文中有多少帧的属性。0=无帧,1=1帧,N=N帧


这不能与
对象的给定属性相混淆。length
,因为
窗口
继承自
对象
()。

length
此时为
0
。它也恰好存在于全局范围(
window
)中。我认为您可能混淆了变量名

允许使用名为
length
的变量作为参数,但此处不允许这样做,因此它使用全局范围内的变量

这就是你想要的:

function areaRectangle(width, height) 
{
    aRectangle = width * height;

    console.log("The area of the rectangle is: " + aRectangle);
}

areaRectangle(10, 7);

您尝试使用
使用strict

功能区域矩形(宽度、高度){
"严格使用",;
A角=宽度*长度;
log(“矩形区域为:“+aRectangle”);
}
面积矩形(10,7)

打开控制台…
来自Mozilla文档:将值分配给未声明的变量会在执行分配时隐式地将其创建为全局变量(它成为全局对象的属性)。通过变量上下文,您的“长度”是指在函数外部获取分配给它的值吗?因为,这是我唯一声明长度的地方。事实上,这就是我的全部代码。是的,所有JavaScript函数都是这样工作的。执行函数时,JavaScript引擎将首先尝试解析函数范围内的所有变量引用。当它在函数范围内找不到变量引用时,它会向上移动到函数的词汇范围上下文。在这种情况下,由于函数是在全局范围内定义的,JavaScript引擎将在全局范围内查找长度变量。它不会抛出错误的原因是浏览器在全局范围中定义了一个length属性。希望这有帮助!是的,它指的是window.length。您之所以感到困惑,很可能是因为您了解在执行JavaScript函数时如何引用变量。当您实际调用函数时,JavaScript引擎将尝试在函数范围内查找长度引用。当引擎在那里找不到长度时(因为您从未在函数中定义长度),引擎将转到父词法作用域,而父词法作用域恰好是全局作用域。在全局范围内,定义了一个长度属性。全局长度属性是window.length。如果您有兴趣了解更多有关JavaScript中作用域的信息,我强烈建议您使用此资源!我用的“长度”这个词是指Window.length?你不是在窗的长度前加一个点来声明窗的属性吗?(.长度)