var x = 5;
function f(y){ return (x+y)-2 };
function g(h){ var x = 7; return h(x) };
{ var x=10; z=g(f) };
我正在从课堂上的课本中解决一些问题,为下一次考试做准备,并且无法弄清楚上面的评估方式。
大多数情况下,我不理解调用z = g(f),因为当评估f时,它没有提供参数,那么它是如何评估的呢?它是如何知道你是什么?
另外,就范围而言,我相信javascript将大部分内容视为全局变量,因此设置的最后一个x将是函数f中使用的x值,对吗?
感谢您的帮助!
请注意,这些是我正在练习准备考试的书后面的额外问题,这些不是直接的家庭作业问题。
答案 0 :(得分:2)
我理解为什么这会令人困惑。让我逐一解释一下这里发生了什么:
var x = 5;
你可能已经弄明白了。声明了一个新变量x
,并为其指定了值5
。
function f(y){ return (x+y)-2 };
这声明了一个关闭已经定义的变量x
的函数。它将此参数添加到其参数中并减去2,返回该值。
function g(h){ var x = 7; return h(x) };
这声明了一个声明局部变量x
的函数,然后将其参数作为函数调用,并向其传递x
的值,该值始终为{ {1}}。
7
这将打开一个新的代码块,并声明一个值为10的变量{ var x=10; z=g(f) };
。但是,由于此声明与先前的x
声明的范围相同(块不创建新的JavaScript中的范围!)它实际上将值10分配给现有变量。然后该块调用函数x
,传入函数g
作为其参数。那么,会发生什么?让我们从调用f
:
g
已通过g
。请记住,f
将函数作为参数,所以这没关系。 g
将使用参数g
调用f
并返回其值。现在让我们考虑一下7
。将f
调用f
,y
等于7
,因为这是一个参数。 x
等于10
,因为原始x
var已分配值10.因此它将返回(x+y)-2
或(10+7)-2
,即15。 / p>
因此z
在脚本执行后将具有值15。
答案 1 :(得分:2)
大多数情况下,我不理解调用z = g(f),因为当评估f时,它没有提供参数,那么它是如何评估的呢?它是如何知道你是什么?
一步一步地采取行动。
问:功能g
做什么?
A:它需要另一个函数作为参数,并使用参数7
调用该函数。
问:那么g(f)
做了什么?
答:它使用参数f
调用7
,因此它等同于f(7)
。
请注意,在没有括号的情况下编写f
实际上并不会调用 f
。在JavaScript中,函数可以作为参数引用和传递,就像任何其他变量一样。函数是一流的对象,你可以用它们做更多的事情,而不仅仅是调用它们!
问: f(7)
的结果是什么?
答:返回语句为return (x+7)-2
。我们需要知道x
。
问: x
内f
的价值是多少?
答: x
此处引用全局变量x
,其值为10
。重要的是,var x = 7
内的g
是局部变量,与全局变量不同。当我们查看函数var x = 7
时,函数g
中的f
声明无关紧要。
同样重要的是,语句var x = 5
和var x = 10
都引用了相同的全局变量。局部变量仅在函数内部引入。简单地使用裸花括号并重复var
关键字不在JavaScript中引入新变量。这是一个棘手的问题,因为在其他语言如C ++中,会引入一个新范围和一个新变量。在JavaScript中它没有。 var x = 10
可以(并且应该!)简写为x = 10
。
说实话,这是一个非常微妙和混乱的观点。这让我想知道你的教科书是否真的打算测试你对这个想法的了解。这是相当神秘的。
问:好的......所以f(7)
的结果是什么?
答: (10+7)-2
或15。
答案 2 :(得分:1)
var x = 5;
function f(y){ return (x+y)-2 };
function g(h){ var x = 7; return h(x) };
{ var x=10; z=g(f) };
这将全局x设置为5,然后(在任何函数调用之前)10。大括号不会创建新范围。
您将f
传递给g
函数(它变为形式参数h
)。然后使用x == 7
调用它(g
是一个具有自己范围的函数,因此x
会影响全局。)
输入f
,x
成为形式参数y
;因此y
为7. (x + y) - 2
然后是10 + 7 - 2
。
答案 3 :(得分:0)
x
设置为5. f
,传递的第一个参数别名为y
。它返回全局x(10)加y的结果,然后减去2。g
,传递的第一个参数是别名h
。它仅在x
的函数体中定义g
。它返回以h
执行的x
结果作为第一个参数传递。假设h
是一个函数。{ var x=10; z=g(f) };
在全局上下文中执行,因此,x
从5到10重新定义。z
被赋予g
调用的结果{ {1}}作为参数传递。 f
:
z=g(f)
被传递,因此在f
的函数体中,g
变为h
。 f
为x
,现在它会调用7
并将其返回。f(7)
被调用并返回f
,即15。诀窍是(10+7)-2
会覆盖{ var x = 10 }
。
答案 4 :(得分:0)
Javascript支持高阶函数,这意味着函数可以作为参数传递给函数,或者从函数返回。在调用z = g(f)中,根本不评估f。 函数 f传递给g,在那里进行评估(如h)。
Javascript不会将所有内容都视为全局变量。但是Javascript使用静态作用域,这意味着函数使用的全局变量是定义它的范围内的变量,而不是它被称为的位置。