Javascript 函数纷繁复杂,调用方式也是多种多样。但是,不是说其基本的规则就十分的复杂。
当然,这些东西只是我个人的理解,用于帮助记忆。
1. 原则1 : 函数名是只是变量,它的值表示一段代码。从C语言的角度来说,函数的名称只是一个地址指针。只是,这个指针式只读的。
你完全可以定义自己的指针来调用函数。JavaScript 也是类似的。
比如下面的代码:
function alert(x)
{
document.write(x);
}
alert(alert);
将在网页上打印:
function alert(x) { document.write(x); }
当然 alert 可以定义成:
var alert = function(x)
{
document.write(x);
}
这个就是真正的变量了。
可以看到,函数名只是一个变量而已。至少,在JavaScript 里面可以这样理解。所以也不要太多的区分匿名函数,普通函数。
最重要的是,你要有个变量能访问到这段代码。
2. 原则2: 函数的执行方式是这样的,(Code)(参数列表); 这里Code 就是 函数变量(变量的值是就是代码),或者直接就是一段Code。
比如,下面的方式都是能运行的:
alert("Hello!");
(function(x)
{
document.write(x);
})("hello");
,有人会问,可不可以省略第一个括号,变成:
function(x)
{
document.write(x);
}("hello");
实际上,如果不加,也没用语法上的错误,只是,编译器把这个拆成两个表达式了
function(x)
{
document.write(x);
}
和 ("hello");, 关于 (expression); 的意义,在后面讨论。
有没有一种操作符,或者函数,让这个整体成为一个表达式呢(不加() 的情况下)?
有, void 。
void function(x)
{
document.write(x);
}("hello");
或者
void 也可以作为一个函数
void(
function(x)
{
document.write(x);
}("hello");
);
或者 void 可以省略
(
function(x)
{
document.write(x);
}("hello");
);
都可以执行。
实际上,只要是这个表达式,作为一个函数的参数,或者作为一个赋值表达式赋值给一个变量的时候,它会作为一个整体执行。
再总结一下:
1. 原则1 : 函数名是只是变量,它的值表示一段代码。
2. 原则2: 函数的执行方式是这样的,(Code)(参数列表);
如果 Code 是 函数变量 , 如 alert ,而不是代码本身, 第一个 () 可以省略。
如果 整个表达式 在 void 表达式里面,第一个() 也可以省略。
如果 作为一个函数的参数,或者作为一个赋值表达式赋值给一个变量的时候,可以省略。
下面来看一个函数:
var toElement = function(){
var div = document.createElement('div');
return function(html){
div.innerHTML = html;
var el = div.childNodes[0];
div.removeChild(el);
return el;
}
}();
第一步:
定义一个函数:
function(){
.....
}
第二步:
执行这个函数。因为闭包,有些局部变量保留在了匿名函数里面。
第三步赋值:
toElement = function(html){
div.innerHTML = html;
var el = div.childNodes[0];
div.removeChild(el);
return el;
}
如果,懂以上的原则,大多数奇怪的js 表达式,应该都能看懂了。
当然,这些东西只是我个人的理解,用于帮助记忆。
1. 原则1 : 函数名是只是变量,它的值表示一段代码。从C语言的角度来说,函数的名称只是一个地址指针。只是,这个指针式只读的。
你完全可以定义自己的指针来调用函数。JavaScript 也是类似的。
比如下面的代码:
function alert(x)
{
document.write(x);
}
alert(alert);
将在网页上打印:
function alert(x) { document.write(x); }
当然 alert 可以定义成:
var alert = function(x)
{
document.write(x);
}
这个就是真正的变量了。
可以看到,函数名只是一个变量而已。至少,在JavaScript 里面可以这样理解。所以也不要太多的区分匿名函数,普通函数。
最重要的是,你要有个变量能访问到这段代码。
2. 原则2: 函数的执行方式是这样的,(Code)(参数列表); 这里Code 就是 函数变量(变量的值是就是代码),或者直接就是一段Code。
比如,下面的方式都是能运行的:
alert("Hello!");
(function(x)
{
document.write(x);
})("hello");
,有人会问,可不可以省略第一个括号,变成:
function(x)
{
document.write(x);
}("hello");
实际上,如果不加,也没用语法上的错误,只是,编译器把这个拆成两个表达式了
function(x)
{
document.write(x);
}
和 ("hello");, 关于 (expression); 的意义,在后面讨论。
有没有一种操作符,或者函数,让这个整体成为一个表达式呢(不加() 的情况下)?
有, void 。
void function(x)
{
document.write(x);
}("hello");
或者
void 也可以作为一个函数
void(
function(x)
{
document.write(x);
}("hello");
);
或者 void 可以省略
(
function(x)
{
document.write(x);
}("hello");
);
都可以执行。
实际上,只要是这个表达式,作为一个函数的参数,或者作为一个赋值表达式赋值给一个变量的时候,它会作为一个整体执行。
再总结一下:
1. 原则1 : 函数名是只是变量,它的值表示一段代码。
2. 原则2: 函数的执行方式是这样的,(Code)(参数列表);
如果 Code 是 函数变量 , 如 alert ,而不是代码本身, 第一个 () 可以省略。
如果 整个表达式 在 void 表达式里面,第一个() 也可以省略。
如果 作为一个函数的参数,或者作为一个赋值表达式赋值给一个变量的时候,可以省略。
下面来看一个函数:
var toElement = function(){
var div = document.createElement('div');
return function(html){
div.innerHTML = html;
var el = div.childNodes[0];
div.removeChild(el);
return el;
}
}();
第一步:
定义一个函数:
function(){
.....
}
第二步:
执行这个函数。因为闭包,有些局部变量保留在了匿名函数里面。
第三步赋值:
toElement = function(html){
div.innerHTML = html;
var el = div.childNodes[0];
div.removeChild(el);
return el;
}
如果,懂以上的原则,大多数奇怪的js 表达式,应该都能看懂了。