本文深入解析JavaScript中变量与函数的多种定义方式。重点介绍对象直接量、数组直接量的创建语法,以及函数直接量(匿名函数)的三种定义形式。详细对比函数字面量与Function()构造函数的性能差异,并演示通过括号、void等技巧调用匿名函数的具体方法。
对象与数组直接量定义
以下是对象直接量的代码示例:
var obj = {x:[1,2],y:23}; 代码与下方示例等价。
上述代码等价于以下传统写法:
var obj=new Object();
obj.x=new Array(1,2);
obj.y=23; 测试用例:
遍历对象属性的测试代码如下:
for(var i in obj) alert(obj[i]); 函数直接量:它是一个表达式而非语句。
函数直接量与匿名函数调用
以下是函数直接量的基本调用形式:
(function(){})() 具体执行示例如下:
代码如下:
(function(){
document.write("some script code");
})()
var a=(function(s){return s})("abc");
alert(a);
var b=function(s){return s};
alert(b("abc")); 如何理解这种调用机制?
大家应该熟悉这种赋值写法:
var a=function (){}
若要执行该函数,只需调用a()即可。
同理,若不通过变量存储直接执行,写法为:
function(){}()
但直接这样写会报错。
因为解析引擎在遇到}时判定函数定义结束,
并未将其作为代码块执行。
添加()可强制将function部分视为表达式块进行执行。
一、什么是匿名函数
JavaScript函数定义的三种方式
在Javascript中,定义函数主要有以下三种方式:
函数关键字声明(function)语句:
function fnMethodName(x){alert(x);}函数字面量(Function Literals):
var fnMethodName = function(x){alert(x);}Function()构造函数:
var fnMethodName = new Function('x','alert(x);')上述三种方式定义了同一个方法函数fnMethodName。第一种是最常用的声明方式;后两种是将一个匿名函数赋值给变量fnMethodName。实际上,许多语言都支持匿名函数。
二、函数字面量和Function()构造函数的区别
虽然函数字面量是匿名函数,但语法允许为其指定名称。在编写递归函数时,可以通过该名称调用自身,而使用Function()构造函数则无法做到这一点。
var f = function fact(x) {
if (x < = 1) return 1;
else return x*fact(x-1);
};
Function构造函数与函数字面量对比
Function()构造函数允许在运行时动态创建和编译JavaScript代码。在此方式上,它类似于全局函数eval()。
Function()构造函数每次执行时都会解析函数主体,并创建一个新的函数对象。因此,在循环或频繁执行的函数中调用Function()构造函数的效率非常低。相反,函数字面量在每次遇到时并不会重新编译。
使用Function()构造函数创建的函数不遵循典型的作用域规则,它始终将代码作为顶级函数执行。
代码如下:
var y = "global";
function constructFunction() {
var y = "local";
return new Function("return y"); // 无法获取局部变量}
alert(constructFunction()()); // 输出 "global" 函数直接量:函数直接量的表达式特性
只要处于表达式语法中,脚本宿主就会将function视为直接量函数;如果单独以function开头,则视为函数声明。将function放入表达式内部(如四则运算),宿主也会将其视为直接量,例如:
代码如下:
var a = 10 + function(){
return 5;
}(); 更极端的例子如下:
代码如下:
(function(){
alert(1);
} ) ( );
( function(){
alert(2);
} ( ) );
void function(){
alert(3);
}()
0, function(){
alert(4);
}();
-function(){
alert(5);
}();
+function(){
alert(6);
}();
!function(){
alert(7);
}();
~function(){
alert(8);
}();
typeof function(){
alert(9);
}(); JavaScript中定义函数的方法有多种,函数直接量是其中之一。例如var fun = function(){},如果function不赋值给fun,它就是一个匿名函数。
接下来看看如何调用匿名函数。
匿名函数的调用技巧
1、执行后获取返回值的函数调用
代码如下:
//方式一,调用函数,得到返回值。强制运算符使函数调用执行
(function(x,y){
alert(x+y);
return x+y;
}(3,4));
//方式二,调用函数,得到返回值。强制函数直接量执行再返回一个引用,引用在去调用执行
(function(x,y){
alert(x+y);
return x+y;
})(3,4); 2、执行后忽略返回值的调用
代码如下:
//方式三,调用函数,忽略返回值
void function(x) {
x = x-1;
alert(x);
}(9); 最后看看错误的调用方式示例
代码如下:
//错误的调用方式
function(x,y){
alert(x+y);
return x+y;
}(3,4);