javascript函数
- 申明式函数
function fn(){}
- 赋值式函数
const fn=function(){}
当申明了形参但是调用时没有传参时,自动赋值undefined
- 终止函数执行:return;
- 当函数没有返回值时,默认返回undefined
- 每个函数只能有一个返回值,允许是任意数据类型
- 每个函数对象都有一个length属性,表示需要传入的实参的个数;而arguments.length表示的是实际传入的实参的个数
var a = function(d,b,c){} console.log(a.length) //3
arguments
-
JS中的函数可以不申明形参,直接传实参,通过arguments获得实参
-
注意点
- 每个函数都拥有一个arguments对象
- arguments只能在函数内使用
- arguments是一个类数组对象,通过索引index访问
-
arguments对象中的两个属性
- length属性
- callee属性
- arguments.callee指向当前函数,返回函数原型,可以通过arguments.callee()调用
JS预编译
- JS引擎在执行代码之前,会优先进行预编译操作
- 创建AO/GO对象
- 找到所有在全局环境下function关键字和var关键字的声明
- 将var/function等声明的变量进行创建,并赋值为undefined
- 将function声明的函数优先执行(即预编译时将函数赋值给变量)(这里指声明式函数)
function fn(a) { console.log(a);// AO对象的值为 function a(){} var a = 123;// 变量声明已经在预编译的时候执行的了 在执行时不会执行变量声明 改变Ao对象中属性a值为123 console.log(a); // 123 function a(){}// 这也不执行 console.log(a); // 123 var b = function(){} // vaar b不执行 改变AO对象中的属性b为function(){} console.log(b);// function() {} function d(){}// 不执行 } fn(1);
- 举例
a(); //输出函数a的原型
var a = 10;
function a() {
console.log(a);
}
a(); //报错
作用域
- JS(ES5)中只有两种作用域
- 全局作用域
- 函数作用域
function fn(){
var a=b=3
// 给没有声明过的变量赋值,这个变量是全局变量
// 这里a是局部变量,b是全局变量
}
- 举例 (预编译+作用域)
var a=1;
function fn(){
console.log(a); //undefined
var a=2;
console.log(a); //2
}
console.log(a); //1
fn(a);
console.log(a) //1
作用域链
- 函数创建时会创建 活动对象(AO)和全局(GO 代码中的所有全局变量)对象,活动对象在函数调用结束后销毁
- 一般情况下,变量取值到 创建 这个变量 的函数的作用域中取值。
- 但是如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链。