您的位置:首页 > Web前端 > JavaScript

javascript函数表达式

2015-11-18 13:09 387 查看
1、函数声明与函数表达式的差异之一:声明可以在被声明之前调用,由于函数声明提升的原因,而函数表达式可以看做是普通变量,因为不能在声明之前引用。

<!doctype>
<html>
<head>
<meta charset="UTF8">
</head>
<script type="text/javascript">
function a(){

}
console.log(a.name);//获取函数名称,在chrome、Safari、Firefox和opera中有效

//函数提升会导致一些意想不到的结果,如下所示
var condition = true;
if(condition){
function b(){
console.log(true);
}
}
else{
function b(){
console.log(false);//一般来说无论condition是true还是false,都会保留后一个
}
}
b();

//如果是函数表达式则没有任何问题,因为函数表达式不会被提升,如下
if(condition){
var c = function(){
console.log(true);
}
}
else{
var c = function(){
console.log(false);
}
}
c();

//函数的递归调用
function d(num){
if(num == 1){
return num;
}
else{
return num * arguments.callee(num-1);
//此处尽量不要使用函数名,防止当函数名发生变化时,出现错误,但是在严格模式下不允许使用callee
}
}
console.log(d(4));
//更靠谱的递归函数,适用于严格模式
var d = (function f(num){
if(num == 1){
return 1;
}
else{
return num * f(num - 1);
}
});
console.log(d(4))

//函数的闭包,有权访问另一函数作用域的函数
function e(name){
return function(){
console.log(name);
}
}
var g = e('guoxiaofen');
g();//被闭包的函数,在父函数结束后,仍能访问其中的变量
g = null;//取消对匿名函数的引用,以便释放内存

//请注意闭包只能取得函数变量的最后一个值
function create(){
var result = new Array();
for(var i = 0 ;i < 10;i++){
result[i] = function(){
console.log('running' + i);
return i;
}
}
console.log('create finish');
return result;
}
var result = create();
console.log(result[1]());//10
console.log(result[4]());//10,请注意只会记录父函数的最后一个值

//修正方法:
function create1(){
var result = new Array();
for(var i = 0 ;i < 10;i++){
result[i] = function(num){//将i复制一份存入临时参数num中
return function(){
return num;
};
}(i);
}
console.log('create finish');
return result;
}
result = create1();
console.log(result[1]());//1
console.log(result[4]());//4

//关于闭包的this对象
var name = 'the window';
var o ={
name :'my o',
sayName : function(){
return function(){
return this.name;
}
}
}
var say = o.sayName();
console.log(say());//the window,函数被调用时自动取得this和arguments对象,
// 搜索这两个变量时,搜索到当前活动对象为止,即global对象,而不是外部闭包对象
var o1 ={
name :'my o1',
sayName : function(){
var that = this;
return function(){
return that.name;
}
}
}
console.log( o1.sayName()());

//意外的改变this值
var person = {
name:'Andy',
sayName:function(){
return this.name;
}
}
console.log(person.sayName());//Andy
console.log((person.sayName)());//Andy
console.log((person.sayName=person.sayName)());//the window

//Dom元素导致的内存泄露
//用闭包函数模仿块级作用域
function output(num){
(function(){
for(var i = 0;i<num;i++){
console.log(i);
}
})();
// console.log(i);//undefined
}
output(2);

//利用闭包定义私有变量,name修改只能通过get或者set函数访问
var highPerson = function(name){
this.getName = function(){
return name;
};
this.setName = function(value){
name = value;

}
}
var Andy = new highPerson('Andy');
console.log(Andy.getName());
Andy.setName('guo');
console.log(Andy.getName());

//
</script>
</html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript 函数