Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript评估问题_Javascript - Fatal编程技术网

Javascript评估问题

Javascript评估问题,javascript,Javascript,为了准备下一次考试,我正在努力解决我班上课本上的一些问题,但我不知道上面的评估结果如何 大多数情况下,我不理解调用z=g(f),因为当对f求值时,它没有提供参数,那么它是如何求值的呢?它怎么知道y是什么 另外,就作用域而言,我相信javascript将大部分内容都视为全局变量,所以最后设置的x将是函数f中使用的x值,对吗 谢谢你的帮助 请注意,这些是我正在练习准备考试的书后面的额外问题,不是直接的家庭作业问题。 全局变量x设置为5 定义了全局函数f,传递的第一个参数别名为y。它返回全局x(10)

为了准备下一次考试,我正在努力解决我班上课本上的一些问题,但我不知道上面的评估结果如何

大多数情况下,我不理解调用z=g(f),因为当对f求值时,它没有提供参数,那么它是如何求值的呢?它怎么知道y是什么

另外,就作用域而言,我相信javascript将大部分内容都视为全局变量,所以最后设置的x将是函数f中使用的x值,对吗

谢谢你的帮助

请注意,这些是我正在练习准备考试的书后面的额外问题,不是直接的家庭作业问题。
  • 全局变量
    x
    设置为5
  • 定义了全局函数
    f
    ,传递的第一个参数别名为
    y
    。它返回全局x(10)加y的结果,然后减去2
  • 定义了全局函数
    g
    ,传递的第一个参数是别名
    h
    。它仅在
    g
    的函数体中定义
    x
    。它返回以
    x
    作为第一个参数传递的
    h
    执行的结果
    h
    被假定为一个函数
  • 表达式
    {varx=10;z=g(f)}在全局上下文中执行,因此,
    x
    从5重新定义为10
    z
    被分配调用的
    g
    的结果,而
    f
    作为参数传递
对于
z=g(f)

  • g被调用
    f
    被传递,因此在
    g
    的函数体中,
    h
    变为
    f
    x
    7
    所以现在它调用
    f(7)
    并返回它
  • 调用
    f
    并返回
    (10+7)-2
    ,即15
诀窍是
{var x=10}
覆盖
5

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) };
var  x  =  5;
这将全局x设置为5,然后(在任何函数调用之前)设置为10。大括号不会创建新的作用域

f
传递到
g
函数中(它成为形式参数
h
)。然后用
x==7
调用(
g
是一个具有自己作用域的函数,因此此
x
会对全局进行阴影处理)


输入
f
x
成为形式参数
y
<因此,代码>y
为7
(x+y)-2
10+7-2

Javascript支持高阶函数,这意味着函数可以作为参数传递到函数中,或者从函数返回。在调用z=g(f)时,根本不计算f。函数f被传递给g,在g中对其求值(作为h)


Javascript不会将所有内容都视为全局变量。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) };
你可能已经弄明白了。声明一个新变量
x
,并为其赋值
5

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) };
var  x  =  5;
这声明了一个函数,该函数围绕已定义的变量
x
关闭。它将此值添加到参数中,然后减去2,返回该值

function f(y){ return (x+y)-2 }; 
这声明了一个函数,该函数声明一个局部变量
x
,然后将其参数作为函数调用,并将
x
的值传递给它,该值始终为
7

function g(h){ var x = 7; return h(x) }; 
这将打开一个新的代码块,并声明一个值为10的变量
x
。但是,由于此声明与先前的
x
(块不会在JavaScript中创建新范围!)声明在同一范围内,因此它实际上会将值10分配给现有变量。然后块调用函数
g
,将函数
f
作为其参数传入。那么,会发生什么?让我们从调用
g
开始:

g
已通过
f
。请记住,
g
将函数作为参数,因此这是正常的
g
将使用参数
7
调用
f
,并返回其值。现在让我们考虑<代码> f>代码>调用code>f时,
y
等于
7
,因为这是一个参数
x
等于
10
,因为原始
x
var被赋值为10。因此它将返回
(x+y)-2
(10+7)-2
,即15

因此,脚本执行后,
z
的值为15

大多数情况下,我不理解调用z=g(f),因为当对f求值时,它没有提供参数,那么它是如何求值的呢?它怎么知道y是什么

一步一步来

Q:函数
g
做什么 A:它将另一个函数作为参数,并使用参数
7
调用该函数

function g(h){ var x = 7; return h(x) }; 
Q:那么
g(f)
做什么呢?
A:它使用参数
7
调用
f
,因此它相当于
f(7)

请注意,编写不带括号的
f
实际上并不调用
f
。在JavaScript中,函数可以像其他变量一样作为参数引用和传递。函数是第一类对象,你可以用它们做更多的事情,而不仅仅是调用它们

Q:f(7)的结果是什么?
A:返回语句是
return(x+7)-2
。我们需要知道
x
的值

Q:
f
x
的值是多少?
A:
x
这里指的是全局变量
x
,其值为
10