你好我已经开始学习一些javascript而且我无法在“正常”函数中解决这个问题。我不明白为什么以下两个函数输出不同的结果。 f2输出5,而f1输出1.为什么?
var f1 = function(){
var x= 1;
var add = function(){
x=5;
};
var result = function(){
console.log(x);
};
return {
add: add,
result: result
};
};
f1().add();
f1().result();
var f2= (function(){
var x= 1;
var add = function(){
x=5;
};
var result = function(){
console.log(x);
};
return {
add: add,
result: result
};
})();
f2.add();
f2.result();
答案 0 :(得分:1)
第一个示例显示了f1()
的两次调用。
第一次调用f1()
会创建一个新的变量作用域,x
设置为1
,并返回带有方法的对象。 .add()
然后将x
设置为5
。
f1()
的第二次调用创建另一个新的变量范围,x
再次设置为1
,并返回带有方法的对象。然后,.result()
会返回仍为x
的{{1}}。
第二个示例仅调用1
一次,因此没有新的变量范围f2()
并且正在创建新方法。
所以基本上x
的两次调用会在每次调用时初始化f1
,并返回两个不同的对象,其方法更接近两个不同的x
变量。
x
被调用一次,因此一个对象共享一个f2
变量并返回方法。因此,x
来电和.add()
来电使用相同的.result()
变量。
答案 1 :(得分:1)
让我概述一下代码中会发生什么:
// Declares a function named f1.
var f1 = function () {
// Searches each scope (the scope of f1, the scope containing f1, etc.) for
// a variable named x. If found, it will reassign it to 1. If the search reaches
// the global scope and no variable is found it will declare and initialize
// a global variable.
x = 1;
// Declares a local variable named add to a function that reassigns the value of x.
var add = function () {
x = 5;
};
// Declares a local variable named result to a function that logs the value of x.
var result = function () {
console.log(x);
};
// Returns an object containing each function.
return {
add: add,
result: result
};
};
// Calls f1 and the returned add function.
f1().add();
// Calls f1 again (which reassigns x) and calls the returned result function.
f1().result();
// Creates a variable named f2 and assigns to the result of applying an anonymous
// function. f2 now references the returned object.
var f2 = (function () {
// Reassigns x, does not create a new variable.
x = 1;
var add = function () {
x = 5;
};
var result = function () {
console.log(x);
};
return {
add: add,
result: result
};
})();
// The difference now is that the function that contains add and result is only
// called once, during the initialization of f2. Had you written var g = f1();
// g.add(); g.result(); you would have gotten the exact same results.
f2.add();
f2.result();