咱只谈和其他语言不一样的地方
1>函数分别有:匿名函数 和 有名函数。
匿名的调用:function(){}
- 在<script> 提取对象如:
var obj = document.getElementById();
obj.onclick = function(){}//调用
有名的调用:function aa(){}
- 同过标签中的系统事件响应:<div οnclick="func()"></div> func(){}
- 自执行:aa(); //注意自执行时,函数内的this指向window。
- 别名:可以用有名函数名代替匿名的事件函数:。
var obj = document.getElementById();
obj.onclick = 别名;
function 别名(){ };//调用
别名在函数的重复使用上有用,增强可读性
2> 函数自执行
什么样的函数能加()执行:
- 函数名();
- 函数表达式();
//第一种
a();
function a(){
alert('A Hello!');
};
//第二种:有多种形式。下述是匿名函数,有名也可以这样
(function(){
alert('TEST1!');
})();
+function(){
alert('TEST2!');
}();
-function(){
alert('TEST3!');
}();
~function(){
alert('TEST4!');
}();
!function(){
alert('TEST5!');
}();
(function(){
alert('TEST6!');
}());
3> 函数 参数(实参 形参)
实参形参一一对应的情况不讲;
实参数(a1) < 形参数 (a2,b2) ;a2取a1,b2未定义
实参数(a1,b1,c1) > 形参数(a2,b2) ;取实参的a1,b1
实参数不确定:(arguments)
每个函数中都会有arguments的类数组,存储实参集合;
可以通过循环遍历
for (var i=0;i<arguments.length;i++ )
4> 函数作用域
作用域:
每个函数执行时,会产生一个新的作用域
每遇到一个作用域,都会重新开始 定义和执行
作用域链:
每一个作用域,当要找某个变量或者函数时,
先从自身找,自身没有的话,往上找(父作用域);
一直都找不到的话,报错;
只能从子作用域往父作用域找,不能父作用域往子作用域找
4.1> script中的解析顺序
两个不同的script标签,先执行完前一个的全部代码,再往下,前一个里面定义了的变量,后面的就可以使用
作用域:
script是最大的域
函数执行就是一个域
javaScript代码的执行顺序:
1:定义
var定义变量,只定义变量名
function定义,找出函数整体
2:执行
除了定义,都是执行,从上往下
- 案例1
//代码
var x = 5;
a();
function a(){
alert( x );
var x = 10;
};
alert( x );
解析:
/*
1.定义:
var x;
function a(){
alert( x );
var x = 10;
};
2.执行:
x = 5;
a(); ===> 1.定义:
var x;
2.执行:
alert( x ); //undefined
x = 10;
alert( x ); // 5
*/
变量名和函数名同名情况:如果都是定义状态,以函数为准
function a(){
alert( 1 );
};
var a;
alert( a );
//结果弹出函数块
但是如果有执行的话,要看执行情况
var a = 10;
function a(){
alert( 1 );
};
alert( a );
/*
1.定义:
var a;
function a(){
alert( 1 );
};
2.执行:
a = 10;
alert( a );
*/
- 变量名和函数名同名情况 复杂案例2
alert( a );
var a = 10;
alert( a );
function a(){alert(20)};
alert( a );
var a = 30;
alert( a );
function a(){alert(40)};
alert( a );
/*
1.定义:
function a(){alert(40)};
2.执行:
alert( a ); //块
a = 10;
alert( a ); //10
alert( a ); //10
a = 30;
alert( a ); //30
alert( a ); //30
*/
- 案例3
var a = 10;
alert( a );
a();
function a(){
alert( 20 );
};
/*
1.定义:
function a(){
alert( 20 );
};
2.执行:
a = 10;
alert( a ); //10
a(); //报错
*/
- 案例4(将就看,csdn编辑器太垃圾,排版老是弄不好)
-
a(); // alert( a ) var a = function(){alert(1)}; a(); function a(){alert(2)}; a(); var a = function(){alert(3)}; a(); /* 1.定义: function a(){alert(2)}; 2.执行: a(); ===> 1.定义 2.执行 alert(2); //2 a = function(){alert(1)}; a(); ===> 1.定义 2.执行 alert(1); //1 a(); ===> 1.定义 2.执行 alert(1); //1 a = function(){alert(3)}; a(); ===> 1.定义 2.执行 alert(3); //3 */
- 案例5
var a = 0;
function fn(){
alert( a );
var a = 1;
alert( a );
};
fn();
alert( a );
/*
1.定义:
var a;
function fn(){
alert( a );
var a = 1;
alert( a );
};
2.执行:
a = 0;
fn(); ===> 1.定义:
var a;
2.执行:
alert( a ); //undefined
a = 1;
alert( a ); //1
alert( a ); //0
*/
- 案例6
fn();
alert( a );
var a = 0;
alert( a );
function fn(){
var a = 1;
};
/*
1.定义:
var a;
function fn(){
var a = 1;
};
2.执行:
fn(); ==> 1.定义:
var a;
2.执行:
a = 1;
alert( a );//undefined
a = 0;
alert( a );//0
*/
- 案例7
fn();
alert( a );
var a = 0;
alert( a );
function fn(){
a = 1;
};
/*
1.定义:
var a;
function fn(){
a = 1;
};
2.执行:
fn(); ==> 1.定义:
2.执行:
a = 1;
alert( a );//1
a = 0;
alert( a );//0
*/
- 案例8
fn()();
var a = 0;
function fn(){
alert( a );
var a = 3;
function c(){
alert( a );
};
return c;
};
/*
1.定义:
var a;
function fn(){
alert( a );
var a = 3;
function c(){
alert( a );
};
return c;
};
2.执行:
fn(); ==> 1.定义:
var a;
function c(){
alert( a );
};
2.执行:
alert( a );//undefined
a = 3;
return c;
fn()(); ==> 1.定义:
2.执行:
alert( a );//3
a = 0;
*/
- 案例9 终极案例
var a = 5;
function fn(){
var a = 10;
alert( a );
function b(){
a ++;
alert( a );
};
return b;
};
var c = fn();
c();
fn()();
c();
/*
1.定义:
var a;
var c;
function fn(){
var a = 10;
alert( a );
function b(){
a ++;
alert( a );
};
return b;
};
2.执行:
a = 5;
fn(); ==> 1.定义:
var a;
function b(){
a ++;
alert( a );
};
2.执行:
a = 10;
alert( a );//10
return b;
c = fn();
c(); ==> 1.定义:
2.执行:
a ++;
alert( a ); //11
fn(); ==> 1.定义:
var a;
function b(){
a ++;
alert( a );
};
2.执行:
a = 10;
alert( a );//10
return b;
fn()(); ==> 1.定义:
2.执行:
a ++;
alert( a ); //11
c(); ==> 1.定义:
a ++;
alert( a ); //12
*/