js中定义函数一般有三种方式:
函数声明;
函数表达式(包括命名函数表达式);
使用Function构造函数。
下面,我就自己的知识面聊一聊这三种定义函数的方式。
一,函数声明;
代码1:
function test(){
alert("testok");
}
二,函数表达式;
(1)匿名函数表达式
代码2:
var f=function (){
alert("fffff");
}
一般这样调用它:
f();//alert("fffff");
(2)命名函数表达式
代码3:
var f=function test2(){
alert("fffff");
}
一般这样调用它:
f();//alert("fffff");
注:test2();这样调用在chrome和FF,下面分别会报错,函数未定义,不合法字符。
(3)关于操作符的怪异函数
下面是这两个函数看起来很怪异。
代码4:
~function a(){
alert(1111);
}();
代码5:
+function a(){
alert(1111);
}();
但是当你把~ +去掉后他们又会报一个SyntaxError的错误。这是因为从语法解析的角度看,
Javascript不允许在函数声明的后面直接使用小括号,而函数表达式则没有这个限制,通过在函数
声明前面加上一个"~“,"+","-","!"操作符,就可以让语法解析器把后面看成是函数表达式。其实
上面的函数可以这样写。
var a=function()
{
alert(1111);
}();
还有一种,如下:
代码6:
(function () {
alert("3434324");
})();
这三种当时声明的函数一般都会自动执行。
下面说说函数声明和函数表达式的区别:
javaScript 解释器中存在一种变量声明被提升(hoisting)的机制,也就是说变量
(函数)的声明会被提升到作用域的最前面,即使写代码的时候是写在最后面,也还是
会被提升至最前面。
例如以下代码段:
代码七:
alert(foo); // function foo() {}
alert(bar); // undefined
function foo() {}
var bar = function bar_fn() {};
alert(foo); // function foo() {}
alert(bar); // function bar_fn() {}
输出结果分别是function foo() {}、undefined、function foo() {}和function bar_fn() {}。
可以看到 foo 的声明是写在 alert 之后,仍然可以被正确调用,因为 JavaScript 解释器会将其
提升到 alert 前面,而以函数表达式创建的函数 bar 则不享受此待遇。那么bar 究竟有没有被提
升呢,其实用 var 声明的变量都会被提升,只不过是被先赋值为 undefined 罢了,所以第二个
alert 弹出了 undefined。
所以,JavaScript 引擎执行以上代码的顺序可能是这样的:
创建变量 foo 和 bar,并将它们都赋值为 undefined。
创建函数 foo 的函数体,并将其赋值给变量 foo。
执行前面的两个 alert。
创建函数 bar_fn,并将其赋值给 bar。
执行后面的两个 alert。
三,使用Function构造函数
代码八:
var sum=new Function ("num1","num2","return num1+num2");
sum();//NAN
sum(1,2);//这样才对
3
从技术角度讲,这也是一个函数表达式,但是不推荐这样方式定义函数,因为这样语法会导致解析
两次代码:第一次解析常规的ECMAScript代码,第二次解析传入构造函数中的字符串,从而影响性
能,不过这种方式对于理解“函数是对象,函数名是指针”的概念倒是非常直观的。
先简单说到这里。由于技术水平有限,请多多指教。
转载于:https://blog.51cto.com/shuizhongyue/1426537