javascript 里function的两种写法有何不同
我写了两个函数,我认为应该没啥区别,但是执行结果却大有区别。哪位高手帮我解释一下,这两种函数调用为什么会不同?functionclose(){varmyline=100;...
我写了两个函数,我认为应该没啥区别,但是执行结果却大有区别。哪位高手帮我解释一下,这两种函数调用为什么会不同?
function close(){
var myline=100;
return(function(){
return(myline++);
});
}
console.log(close()); //console output:// funciton()
console.log(close()()); //console output:// 100
console.log(close()()); //console output:// 100
//closure example
var copyclose=(function(){
var myline=300;
return(function(){
return myline++;
});
}());
console.log(copyclose()); //console output:// 300
console.log(copyclose()); //console output:// 301
console.log(copyclose); //console output:// function() 展开
function close(){
var myline=100;
return(function(){
return(myline++);
});
}
console.log(close()); //console output:// funciton()
console.log(close()()); //console output:// 100
console.log(close()()); //console output:// 100
//closure example
var copyclose=(function(){
var myline=300;
return(function(){
return myline++;
});
}());
console.log(copyclose()); //console output:// 300
console.log(copyclose()); //console output:// 301
console.log(copyclose); //console output:// function() 展开
2个回答
展开全部
应用上没有本质区别,区别在于函数声明的阶段。
function close(){...}
会在语法分析阶段完成函数声明,此方法的 function 放置在执行函数代码的后面也能够使用。
var copyclose=(function(){...}
会在代码执行阶段完成函数声明,此方法的 function 必须放置在执行函数代码的前面才能够使用。
例如下面的代码是用来获取函数的函数名,我们可以发现两种方式声明的函数是不一样的
var f = function() { console.log(arguments.callee.name) }
f();
// 此时返回 "" (空字符串)
function f() { console.log(arguments.callee.name) }
f();
// 此时返回 "f"
换一种更直观的方式来表达区别
a(); // 在赋值前进行
var a=function(){return 1;}
//此时会报错,TypeError: undefined is not a function
//以上代码的语法没有问题,但是 a 函数在赋值前就执行了,此时并未声明 a 函数,因此就报错了。
b();
function b(){return 2;}
//此时返回 2
追问
我现在想明白了。第二种写法,相当于指针引用。 就是定义了一个对象,然后用变量引用那个对象。非常感谢
追答
楼主的问题我只看了标题,代码只看了Close就仓促的回答。
以上回答与楼主的问题关系并不大,wuxd7 的回答是正确的,下面是过程解答。
var copyclose=(function b(){//这里的b没有意义,后面有分组操作符
var myline=300;
console.log(myline);
return(function(){
console.log(myline);
return ++myline; //先加后显示
});
}
()//分组操作符,使b函数自执行
);
先上一段代码,为了更方便查看数字的变化,改为了先加后显示。
以上代码的结果重点在于自执行函数,由于自执行函数的关系,b()函数被先执行了,因此 myline 已被定义,然后 copyclose 引用 return 返回的结果。
即:
function(){
console.log(myline);
return ++myline; //先加后显示
}
由于引用关系,闭包无法被释放,myline 依旧储存在内存中,当执行 copyclose() 时,实际执行的是以上代码。
最终看到的结果是:myline+1
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询