Javascript 函数的两个基本原则

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 表达式,应该都能看懂了。
posted @ 2009-08-30 17:20  暮夏  阅读(508)  评论(0编辑  收藏  举报