JavaScript函数的进阶
作用域
-
全局作用域
写脚本块中的代码
全局作用于中声明的变量,会被提前到代码块的顶部进行定义,成为全局对象的属性 -
函数作用域
函数内部定义的变量,会被提升到函数代码块中的顶部,并且不会成为全局对象的属性函数中声明的变量不会造成全局污染,把每一个功能封装到函数中
函数表达式
- 函数表达式不会被提前声明,不会污染全局
// 字面量创建函数
// function test(){
// }
var a = function test(){
console.log('Helloworld');
}
// test(); 执行不成功
a();
console.log(b);// undefined
console.log(typeof b);// undefined
// b();// 报错
var b = function(){ // 匿名函数
console.log('oys');
}
b();
console.log(demo);
demo();
function demo(){
console.log('demo');
function fn(){
console.log('1111')
}
}
demo();// 执行之后 里面fn才会提升声明
// function 引用数据类型
// 基本数据类型
// 引用数据类型 function object Array Object
// instanceof
var obj = {
a:'oys',
b:function(){
console.log('oys');
}
}
obj.b();// oys
var fn = obj.b;
fn();// oys
// 把函数作为参数进行传递
var b = function(){
console.log('康师傅');
}
function wk(call){
console.log(call); // function(){console.log('康师傅');}
call();
}
wk(b);
// 控制台输出??
// 函数体
// 康师傅
// 函数放在数组中
var arr = [1,'oys',function(){console.log(1)}];
arr[2]();
## 函数参数
- 基本数据类型 按值传递
- 引用数据类型 按地址传递
## 立即执行函数
js中,把一个函数变成函数表达式,用小括号包裹起来
```js
(function(){})()
(function(){}())
function(){}()
预编译
- js解释型语言,解释一句执行一句
- 语法的检测
- 预编译
变量和函数的提前声明
全局预编译- 创建一个GO对象 Global Object
- 将var关键字声明的变量当作GO对象的属性,赋值为undefined,有重名的直接覆盖
- 将function关键字声明函数 当作GO对象的属性,值为函数体,重名直接覆盖
函数预编译
函数执行的前一刻开始 - 创建一个AO对象 Activation Object 执行期上下文对象
- 函数的形参,成为AO对象的属性,值为实参的值,若未传值,值为undefined
- 将var关键字声明的变量,成为AO对象的属性,值为undefined,遇到已经存在的,不做任何变化
- 将function声明的函数 成为AO对象的属性 值为函数体,重名直接覆盖
- 代码执行