函数基础
函数声明和函数表达式的区别
虽然都可以定义函数,但最大的区别在于:
解析器会率先读取函数声明,使其在执行任何代码之前就可以访问(也就是 函数声明提升);
而函数表达式则需要解析器执行到它所在的代码行才会被解释执行。
什么是变量的声明前置?什么是函数的声明前置?
-
什么是变量的声明前置?
JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,然后给他初始值undefined,然后才逐句执行程序,这就叫做“变量提升”,也即“变量的声明前置”。 -
什么是函数的声明前置
函数的声明前置就是把整个函数提升到当前作用域的最前面(位于前置的变量声明后面)。
arguments 是什么?
arguments 是一个类数组对象。代表传给一个function的参数列表。
arguments[0]就是第一个参数,arguments[1]就是第二个参数,以此类推。这个对象只有在函数体内部,才可以使用。
函数的重载怎样实现?
-
重载是很多面向对象语言实现多态的手段之一,在静态语言中确定一个函数的手段是靠方法签名——函数名+参数列表,也就是说相同名字的函数参数个数不同或者顺序不同都被认为是不同的函数,称为函数重载
-
在JavaScript中没有函数重载的概念,函数通过名字确定唯一性,参数不同也被认为是相同的函数,后面的覆盖前面的,所以只能通过一些方法来实现模拟重载
function bar() { if(arguments.length == 1) { alert(arguments[0] + 5); } else if(arguments.length == 2) { alert(arguments[0] + arguments[1]); } } bar(10); //输出 "15" bar (40, 20); //输出 "60"
立即执行函数表达式是什么?有什么作用
立即执行函数表达式:
(function(){ /* code */ }());
// 或者
(function(){ /* code */ })();
通常情况下,只对匿名函数使用这种“立即执行的函数表达式”。它的目的有两个:一是不必为函数命名,避免了污染全局变量;二是IIFE内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。
什么是函数的作用域链
作用域就是变量与函数的可访问范围,在JavaScript中,变量的作用域有全局作用域和局部作用域两种。
全局作用域:在代码中任何地方都能访问到的对象拥有全局作用域。
局部作用域:和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到。
用域链的原理是,如果变量在该作用域中没有,则它会逐级向上寻找,直至最顶层。