方法一
test = function(){
//...
}方法二
function test(){
//...
}之前也没注意这个细节,一直习惯用方法二,最近看了些别人写的代码,发现,也有不少人用方法一,当然,效果目前我感觉是没区别的,不知道这两种写法,是否真的没半写区别呢?只是个人书写习惯不同而以,还是
js也没系统学过,都是自学的,理论方法理解不深,各位js资深大侠说点看法吧。
test = function(){
//...
}方法二
function test(){
//...
}之前也没注意这个细节,一直习惯用方法二,最近看了些别人写的代码,发现,也有不少人用方法一,当然,效果目前我感觉是没区别的,不知道这两种写法,是否真的没半写区别呢?只是个人书写习惯不同而以,还是
js也没系统学过,都是自学的,理论方法理解不深,各位js资深大侠说点看法吧。
第一种是函数表达式
第二种是函数声明使用第一种方法,必须写定义,后使用,有着严格的顺序
test();//放在这里就会报错,缺少对象
var test = function(){
alert(1)
};
//test();//放在这里可以正确执行而函数声明则不同,函数声明在预编译是有优先级,会先编译好函数,只要在相同作用域下,可以在任何地方调用它,因为它会被“置前”
test();//正确执行
function test(){
alert(1);
};
test();//正确执行
就类似于你声明一个变量 var str="aaaaaa" ;
必须得先声明才能调用,否则,小心 又要找不到对象了
也就是一个作用域的问题的,不过个人特别喜欢用第一种,感觉语法上比较帅气。
首先,
在Javascript定义一个函数一般有如下三种方式:
函数关键字(function)语句:
function fnMethodName(x){alert(x);}
函数字面量(Function Literals):
var fnMethodName = function(x){alert(x);}
Function()构造函数:
var fnMethodName = new Function('x','alert(x);')
摘自:http://dancewithnet.com/2008/05/07/javascript-anonymous-function/
fn = function(){
alert(1);
};
function fn(){
alert(2);
}
fn(); // 1 or 2 ?
函数关键字 在当前作用域中被提升了,编译结果如下
var fn;
fn = function(){
alert(2);
}
fn = function(){
alert(1);
};
fn(); // 前面的定义 被 后面的定义 覆盖了,所以alert `1`
再看下面的几个变形
;(function(){
fn = function(){
alert(1);
};
})();
function fn(){
alert(2);
}
fn(); // 1 or 2 ?
;(function(){
var fn = function(){
alert(1);
};
})();
function fn(){
alert(2);
}
fn(); // 1 or 2 ?
;(function(){
function fn(){
alert(2);
}
})();
fn = function(){
alert(1);
};
fn(); // 1 or 2 ?
扩展阅读:
http://dancewithnet.com/2007/03/22/order-of-execution-of-javascript-on-web/
http://www.cnblogs.com/TomXu/archive/2011/12/29/2290308.html
var fn={
a:3,
b:2,
add:function(){
return this.a+this.b
}
};
alert(fn.a+'+'+fn.b+'='+fn.add())
var fn=function(){
return me={
a:1,
b:2,
add:function(){
return me.a+me.b
}
}
}();
alert(fn.a+'+'+fn.b+'='+fn.add())
var objectTest=function(){ this.print=function(){
alert("aa");
}}var ot=new objectTest();
ot.print();
第一种是函数表达式
第二种是函数定义
函数定义的会预加载,即代码还没有指向到就已经被加载了
第二种只有运行到代码时才执行
举个例子
alert(x); //undefined
alert(y); //object
var x = function() {
};
function y() {
}