(function () {
var x = 5;
(function () {
function f(y) { return (x+y)-2 };
(function () {
function g(h) { var x = 7; return h(x) };
(function () { var x=10; z=g(f); })();
})();
})();
})();
我正在从课堂上的教科书中解决一些问题,为下一次考试做准备,并且无法弄清楚上面的评估方式。
大多数情况下,我不理解调用z = g(f),因为当评估f时,它没有提供参数,那么它是如何评估的呢?怎么知道你是什么? g(f)会评估什么?
另外,就范围而言,我相信javascript将大部分内容视为全局变量,因此设置的最后一个x将是函数f中使用的x值,对吗?
感谢您的帮助!
请注意,这些是我正在练习准备考试的书后面的额外问题,这些不是直接的家庭作业问题。
答案 0 :(得分:1)
在g(f)
的情况下,函数f
未被计算,而是作为对象/值传递。函数是javascript中的值,可以这样传递。函数g
稍后通过表达式f
评估函数h(x)
(因为f
作为参数传递h
)
这是一个更直接的例子
var addOne = function(x) { return x+1; }
var f = addOne;
var value = f(4); // Returns 5
答案 1 :(得分:1)
有助于更好地格式化和缩进,以便更容易调查发生的事情:
(function() {
var x = 5;
(function() {
function f(y) { // <-- y is the x from function g
return (x + y) - 2
};
(function() {
function g(h) {
var x = 7; // <-- local x is defined and passed to f
return h(x) // <-- h === f
};
(function() {
var x = 10;
z = g(f); // <-- f is passed to g
})()
})()
})()
})()
答案 2 :(得分:1)
函数中定义的变量作用于该函数。如果这是真正的一个类,你应该从那里找出其余部分。
答案 3 :(得分:0)
大多数情况下,我不理解这个电话 z = g(f),当评估f时,它 没有提供论据,所以如何 它会评估吗?怎么做的 知道你是什么? g(f)会是什么 评价到?
如果你看一下g
的实施方式:
function g(h) { var x = 7; return h(x) };
它需要一个参数h
,这是一个Function
,然后将其称为h(x)
。我希望这可以帮助您了解z = g(f)
最终如何运行函数f
。
另外,就范围而言,我 相信javascript对待最多 一切都是全局变量,所以 设置的最后一个x将是x 函数f中使用的值,正确吗?
不正确的。使用var
语句时,将定义本地范围中的新变量。在您的情况下,最终x
不是全局的。
答案 4 :(得分:0)
为了便于阅读,我还beautified。
(function () {
var x = 5;
这会将局部变量x
设置为5。
(function () {
function f(y) {
return (x + y) - 2
};
这会创建一个本地函数f
;请注意,上述x
(目前为5)已关闭。
(function () {
function g(h) {
var x = 7;
return h(x)
};
我们定义一个函数g
,它将函数h
作为参数。它有一个局部变量x
,它会影响另一个变量。
(function () {
var x = 10;
z = g(f);
})()
这x
是一只红鲱鱼;它会影响外层,并且从未实际使用过。然后我们调用g
,传递f
。继续上面g
,我们看到f
成为正式参数h
,并且在7 f
中调用y
。(5 + 7) - 2
成为x
。所以我们得到{{1}},10。由于阴影,不等同于其他代码。
外部{{1}}永远不会被修改,只是被遮蔽。