javascript - 关于js函数定义方法的困惑
怪我咯
怪我咯 2017-04-11 12:57:54
[JavaScript讨论组]
var a=new function(){};
var a=new Function(){};
var a=function(){};
function a(){};

主要是这几个吧,就是不太清楚它们之间的具体区别?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(4)
高洛峰

第一个是将function当作构造函数,用new创造一个对象,a会得到function的this。
第二个不出意外会报错,Function是函数的构造对象,在js里,每个函数其实都是Function的对象。
第三个是申明一个变量,将函数表达式赋值给这个变量。
第四个是函数声明。

巴扎黑

JS中function是关键字,Function是全局对象(是所有函数的构造函数)。
第一个相当于用new操作符调用了一个匿名函数,因此返回一个对象,typeof a === 'object'
第二个SyntaxError,估计你想表达的是var a=new Function(); 此时a为一个函数
第三个是将右侧的匿名函数表达式赋值给变量a
第四个是函数声明

高洛峰

首先 functionFunction 是有本质上的差异,前者是关键词,后者是Function对象。二者更应该分开来使用。

Function

其实就像是 eval 一样,除性能上是一个诟病以外,也同它一样一不小心很难控制上下文。

另,Function 产生的是全局作用域下的 non-strict 函数。

综合上述,还是不要去用它的好。

不过有时候是必须的,像字符串模板引擎,有兴趣阅读artTemplate的源代码。

另,题主的写法是错误的,不应该包括 {}

function

首先通过关键词创建变量实际是一个指针。

而对于3、4声明方式差不多相同,除了解析器优先被识别的差异而已:

-- success
console.log(a());
function a() { return 'ok'; }

-- error
console.log(b());
var b = function() { return 'ok'; }

以上。

阿神

这个东西牵扯的面还是比较广的:

  • 先简述一下几个概念:

    1. 构造器

      构造函数,就是一个普通的函数,与其他函数没有任何区别,可以理解为 函数==构造函数,
      它只是概念上的一个定义,使用它用来实例化对象。
      对于JavaScript的内置对象,Object、Array、Date等等这些都是构造函数。
                                          ————摘自百度
    2. 函数声明

      构建一个方法可传入参数,执行特定的操作或返回某些值
  • Function

    • Function是所有function的构造函数

    • 可以通过 new Function(/*function string*/)的形式创建一个function

    • var a = new Function();可以创建一个空函数

    • new Function(){}的写法是不正确的

  • new function(/args/)

    • 这个写法会返回一个对象而非函数

    • 这是标准构造函数的用法

    • 构造函数默认返回this值,若构造函数包含return,则返回return的内容

  • function funName(/args/){/TODO:/}

    • 这是一个声明函数的方式

    • 该函数名为funName

    • 基于ES5标准,该函数的name属性为funName的字符串形式

    • 执行该函数的方法为 funName(/args/);传入的参数一般需要提前声明

    • JS中function构成最基本的作用于

  • function(/args/){/TODO:/}

    • 这是另一个声明函数的方式

    • 这种声明方式被称为匿名函数

    • 匿名函数不能独立存在,需要在函数前添加其他操作符,如:

      • (function(){})

      • +function(){}

      • =function(){} 例如 var a=function(){}

      • :function(){} 例如 var a={s:function(){}};

      • ...

    • 匿名函数若被赋值给一个独立变量,则name属性为该变量名的字符串形式

    • 若将一个匿名函数赋值给一个对象的属性,这name属性为空字符串

/*
 * 首先a不是一个函数,而是一个对象
 * function(){}声明了一个空匿名函数
 * new 关键字通过空的匿名函数创建了一个空对象
 */
var a=new function(){};
/*
 * 这里报错
 * Unexpected token {
 * 不应出现{
 */
var a=new Function(){};
/*
 * 声明一个匿名函数
 * 并赋值给变量a
 */
var a=function(){};
/*
 * 声明一个名为a的函数
 */
function a(){};
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号