扫码关注官方订阅号
var a=new function(){}; var a=new Function(){}; var a=function(){}; function a(){};
主要是这几个吧,就是不太清楚它们之间的具体区别?
走同样的路,发现不同的人生
第一个是将function当作构造函数,用new创造一个对象,a会得到function的this。第二个不出意外会报错,Function是函数的构造对象,在js里,每个函数其实都是Function的对象。第三个是申明一个变量,将函数表达式赋值给这个变量。第四个是函数声明。
JS中function是关键字,Function是全局对象(是所有函数的构造函数)。第一个相当于用new操作符调用了一个匿名函数,因此返回一个对象,typeof a === 'object'第二个SyntaxError,估计你想表达的是var a=new Function(); 此时a为一个函数第三个是将右侧的匿名函数表达式赋值给变量a第四个是函数声明
首先 function 和 Function 是有本质上的差异,前者是关键词,后者是Function对象。二者更应该分开来使用。
function
Function
其实就像是 eval 一样,除性能上是一个诟病以外,也同它一样一不小心很难控制上下文。
eval
另,Function 产生的是全局作用域下的 non-strict 函数。
综合上述,还是不要去用它的好。
不过有时候是必须的,像字符串模板引擎,有兴趣阅读artTemplate的源代码。
另,题主的写法是错误的,不应该包括 {}。
{}
首先通过关键词创建变量实际是一个指针。
而对于3、4声明方式差不多相同,除了解析器优先被识别的差异而已:
-- success console.log(a()); function a() { return 'ok'; } -- error console.log(b()); var b = function() { return 'ok'; }
以上。
这个东西牵扯的面还是比较广的:
先简述一下几个概念:
构造器
构造函数,就是一个普通的函数,与其他函数没有任何区别,可以理解为 函数==构造函数, 它只是概念上的一个定义,使用它用来实例化对象。 对于JavaScript的内置对象,Object、Array、Date等等这些都是构造函数。 ————摘自百度
函数声明
构建一个方法可传入参数,执行特定的操作或返回某些值
Function是所有function的构造函数
可以通过 new Function(/*function string*/)的形式创建一个function
new Function(/*function string*/)
var a = new Function();可以创建一个空函数
var a = new Function();
new Function(){}的写法是不正确的
new Function(){}
new function(/args/)
这个写法会返回一个对象而非函数
这是标准构造函数的用法
构造函数默认返回this值,若构造函数包含return,则返回return的内容
this
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=function(){}
:function(){} 例如 var a={s: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(){};
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
第一个是将function当作构造函数,用new创造一个对象,a会得到function的this。
第二个不出意外会报错,Function是函数的构造对象,在js里,每个函数其实都是Function的对象。
第三个是申明一个变量,将函数表达式赋值给这个变量。
第四个是函数声明。
JS中function是关键字,Function是全局对象(是所有函数的构造函数)。
第一个相当于用new操作符调用了一个匿名函数,因此返回一个对象,typeof a === 'object'
第二个SyntaxError,估计你想表达的是var a=new Function(); 此时a为一个函数
第三个是将右侧的匿名函数表达式赋值给变量a
第四个是函数声明
首先
function和Function是有本质上的差异,前者是关键词,后者是Function对象。二者更应该分开来使用。Function
其实就像是
eval一样,除性能上是一个诟病以外,也同它一样一不小心很难控制上下文。另,Function 产生的是全局作用域下的 non-strict 函数。
综合上述,还是不要去用它的好。
不过有时候是必须的,像字符串模板引擎,有兴趣阅读artTemplate的源代码。
另,题主的写法是错误的,不应该包括
{}。function
首先通过关键词创建变量实际是一个指针。
而对于3、4声明方式差不多相同,除了解析器优先被识别的差异而已:
以上。
这个东西牵扯的面还是比较广的:
先简述一下几个概念:
构造器
函数声明
Function
Function是所有function的构造函数可以通过
new Function(/*function string*/)的形式创建一个functionvar 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属性为空字符串