Javascript评估问题

时间:2010-11-19 18:02:12

标签: javascript

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值,对吗?

感谢您的帮助!

请注意,这些是我正在练习准备考试的书后面的额外问题,这些不是直接的家庭作业问题。

5 个答案:

答案 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调用fy等于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

的价值

问: xf的价值是多少?
答: x此处引用全局变量x,其值为10。重要的是,var x = 7内的g是局部变量,与全局变量不同。当我们查看函数var x = 7时,函数g中的f声明无关紧要。

同样重要的是,语句var x = 5var 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会影响全局。)

输入fx成为形式参数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

  • g被调用。 z=g(f)被传递,因此在f的函数体中,g变为hfx,现在它会调用7并将其返回。
  • f(7)被调用并返回f,即15。

诀窍是(10+7)-2会覆盖{ var x = 10 }

答案 4 :(得分:0)

Javascript支持高阶函数,这意味着函数可以作为参数传递给函数,或者从函数返回。在调用z = g(f)中,根本不评估f。 函数 f传递给g,在那里进行评估(如h)。

Javascript不会将所有内容都视为全局变量。但是Javascript使用静态作用域,这意味着函数使用的全局变量是定义它的范围内的变量,而不是它被称为的位置。