详解JavaScript中的函数声明和函数表达式

来源:爱站网时间:2019-08-24编辑:网友分享
JavaScript函数可以让JS具有对象的特性,但是每件事都有两面性,javascript函数有时更“反复无常”,如果你不了解它的“气质”,很可能给你带来一些意想不到的麻烦,接下来是爱站技术频道小编详解JavaScript中的函数声明和函数表达式,希望对你有帮助!

JavaScript函数可以让JS具有对象的特性,但是每件事都有两面性,javascript函数有时更“反复无常”,如果你不了解它的“气质”,很可能给你带来一些意想不到的麻烦,接下来是爱站技术频道小编详解JavaScript中的函数声明和函数表达式,希望对你有帮助!

各自写法如下:

// 方法一:函数声明

function foo() {}


// 方法二:函数表达式
var foo = function () {};

另外还有一种自执行函数表达式,主要用于创建一个新的作用域,在此作用域内声明的变量不会和其它作用域内的变量冲突或混淆,大多是以匿名函数方式存在,且立即自动执行:

(function () {
  // var x = ...
})();

此种自执行函数表达式归类于以上两种方法的第二种,也算是函数表达式。

方法一和方法二都创建了一个函数,且命名为 foo,但是二者还是有区别的。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。

注:

严格地说,再 JavaScript 中创建函数的话,还有另外一种方法,称为“函数构造法”:

var foo = Function('alert("hi!");');
var foo = new Function('alert("hi!");'); // 等同于上面一行

上文是爱站技术频道小编详解JavaScript中的函数声明和函数表达式,此方法以字符串作为参数来形成函数体,但这样会降低执行效率,而且似乎无法传递参数,所以最好少用。

上一篇:总结Java集合类操作优化经验

下一篇:Android的应用中实现网络图片异步加载的方法

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载