博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Function构造函数、 函数声明 、 函数表达式 的区别
阅读量:6876 次
发布时间:2019-06-26

本文共 2034 字,大约阅读时间需要 6 分钟。

对比下面的例子:

Function构造函数

var multiply = new Function('x', 'y', 'return x * y');复制代码

函数声明

function multiply(x, y) {   return x * y;} // 没有分号复制代码

函数表达式

var multiply = function(x, y) {   return x * y; };复制代码

一个命名为func_named的函数的函数表达式,被赋值给变量multiply:

var multiply = function func_name(x, y) {   return x * y;};复制代码

区别

  • 函数名不能被改变,但函数的变量却能够被再分配
  • 函数名只能在函数体内使用
  • 倘若在函数体外使用函数名将会导致错误(如果函数之前是通过一个var语句声明的则是undefined)。如:
var y = function x() {};alert(x); // throws an error复制代码
  • 函数名和函数的变量存在着差别。函数名不能被改变,但函数的变量却能够被再分配。函数名只能在函数体内使用。倘若在函数体外使用函数名将会导致错误
  • 函数名与被函数赋值的变量是不相同的. 彼此之间没有关系
  • 函数声明同时也创建了一个和函数名相同的变量
  • 使用 'new Function'定义的函数没有函数名。在 SpiderMonkey JavaScript引擎中,其函数的序列化形式表现的好像它拥有一个名叫"anonymous"的名称一样,而实际上其函数并没有名称,anonymous 不是一个可以在函数内被访问到的变量
  • 和函数表达式或者Function构造函数定义的函数不同,函数声明的函数可以在它被声明之前使用。如:
// 函数声明foo() // foofunction foo() {    return 'foo'}// 函数表达式foo2() // foo2 is not a functionvar foo2 = function(){    return 'foo2'}// Function 构造函数  foo3()  // foo3 is not a functionvar foo3 = new Function('return "foo3"')复制代码
  • 函数表达式定义的函数继承了当前的作用域。换言之,函数构成了闭包。另一方面,Function构造函数定义的函数不继承任何全局作用域以外的作用域(那些所有函数都继承的)。

  • 通过函数表达式定义的函数和通过函数声明定义的函数只会被解析一次,而Function构造函数定义的函数却不同。

注意在通过解析Function构造函数字符串产生的函数里,内嵌的函数表达式和函数声明不会被重复解析。例如:

var foo = (new Function("var bar = \'FOO!\';\nreturn(function() {\n\talert(bar);\n});"))();foo(); // 函数体字符串"function() {\n\talert(bar);\n}"的这一部分不会被重复解析。复制代码

函数声明如何转成函数表达式

  • 成为表达式的一部分
// 函数表达式var foo = function(){}var bar = function bar(){}(function bar2() {})复制代码
  • 不再是函数或者脚本自身的“源元素” (source element)。“源元素”是脚本或函数体中的非嵌套语句
var x = 0;               // source elementif (x === 0) {           // source element   x = 10;               // 非source element   function boo() {}     // 非 source element 函数表达式}function foo() {         // source element   函数声明   var y = 20;           // source element   function bar() {}     // source element   函数声明   while (y === 10) {    // source element    function blah() {} // 非 source element 函数表达式     y++;               //非source element   }}复制代码

如有侵权,请发邮箱至wk_daxiangmubu@163.com 或留言,本人会在第一时间与您联系,谢谢!!

长按二维码关注我们,了解最新前端资讯

转载地址:http://wfgfl.baihongyu.com/

你可能感兴趣的文章
P4175 [CTSC2008]网络管理
查看>>
C#开发学习——常用的正则表达式
查看>>
这样一篇典型的软文
查看>>
微信内置的浏览器window.location.href 跳转不兼容问题
查看>>
数据库相关内容 已看1 有用
查看>>
【bzoj3110】[Zjoi2013]K大数查询
查看>>
java中相对路径,绝对路径问题总结
查看>>
[转载] 山楂树之恋——07-09
查看>>
足球——2011-2012德甲球队队标
查看>>
Signalr系列之虚拟目录详解与应用中的CDN加速实战
查看>>
一个简单的Linux后门程序的实现
查看>>
前端之jquery
查看>>
Java练习 SDUT-2246_时间日期格式转换
查看>>
Python中 可变参数
查看>>
python_函数传递列表
查看>>
上海市松江区 <-> 上海市金山区枫泾·万枫东路ab6177,racehttp://live.racing-china.com/...
查看>>
webpack 学习笔记 (一)
查看>>
eclipse安装spring的插件
查看>>
hide software keybox
查看>>
Linux下clock计时函数学习【转】
查看>>