函数声明和函数表达式有什么区别 (*)
- 函数声明
var printName = function(){
console.log('Byron');
}; - 函数表达式
function printName(){
console.log('Byron');
}
printName(); - 区别。
以下为范例。
console.log( shengMing );
console.log( biaoda );
function shengMing(){
console.log("shengming")
};
var biaoda=function biaoDa(){
console.log("biaoda")
};
console.log( shengMing );
console.log( biaoda );
由此可以看出,即使函数shengMing是在后面声明的,但是也可以在前面叼用。而函数表达式则不可以。说明对于函数声明,函数名称和函数体均提前声明了,可以在声明之前调用它;但对于函数表达式,只有函数变量声明提前了,但是函数的初始化代码仍然在原来的位置。
什么是变量的声明前置?什么是函数的声明前置 (**
)
-
变量提升
JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部。
console.log(a);
console.log(b);
var a=1;
可以看到虽然var a=1 放在了后面,但是还是可以看出,var a 被声明前置了。
- 函数表达式的声明前置
console.log(fn);
var fn = function(){
biaodashi
};
其输出结果也是为underfined。因为函数表达式相当于是声明了一个变量。 -
函数声明的声明前置
console.log(fn);
function fn(){
shengming
};
可以看到其输出了fn函数,而不是undefined。
arguments 是什么 (*)
-
在函数内部,你可以使用arguments对象获取到该函数的所有传入参数
function printPersonInfo(name, age, sex){
console.log(name);
console.log(age);
console.log(sex);
console.log(arguments);
console.log(arguments.length);
}
printPersonInfo("hunger","22","man")
结果
函数的重载怎样实现 (**
)
- 重载是很多面向对象语言实现多态的手段之一,在静态语言中确定一个函数的手段是靠方法签名——函数名+参数列表,也就是说相同名字的函数参数个数不同或者顺序不同都被认为是不同的函数,称为函数重载
- 在JavaScript中没有函数重载的概念,函数通过名字确定唯一性,参数不同也被认为是相同的函数,后面的覆盖前面的。可利用arguments实现函数的类重载。
function printInfo(){
for(var i=0;i<arguments.length;i++){
console.log(arguments[i])
}
}
printInfo("hunger","22","man");
printInfo("hunger","22");
printInfo("hunger");
立即执行函数表达式是什么?有什么作用 (***
)
以上两种即为立即执行函数表达式。
- 模拟块作用域 众所周知,JavaScript没有C或Java中的块作用域(block),只有函数作用域,在同时调用多个库的情况下,很容易造成对象或者变量的覆盖
- 解决闭包冲突
- 模拟单例
http://weizhifeng.net/immediately-invoked-function-expression.html
什么是函数的作用域链 (****
)
- 在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。
- 作用域
作用域就是函数和变量可以访问的范围,JS中变量的作用域分为全局作用域和局部作用域。JS的作用域是靠函数来形成的,也就是说一个函数内定义的变量函数外不可以访问,变量在声明它们的函数体及其子函数内是可见的。
1.以下代码输出什么? (难度**
)
function getInfo(name, age, sex){
console.log('name:',name);
console.log('age:', age);
console.log('sex:', sex);
console.log(arguments);
arguments[0] = 'valley';
console.log('name', name);
}
getInfo('hunger', 28, '男');
getInfo('hunger', 28);
getInfo('男');
2.写一个函数,返回参数的平方和?如
function sumOfSquares(){
}
sumOfSquares(2,3,4); // 29
sumOfSquares(1,3); // 10
代码如下
function sumOfSquares(){
for(i=0,s=0;i<arguments.length;i++){
s=s+arguments[i]*arguments[i];
} //之前设置了在for语句内部设置了var s=0,导致只输出最后一个参数的平方。
console.log(s);
};
3.如下代码的输出?为什么
console.log(a);
var a = 1;
console.log(b);
考察了变量提升。如下代码相当于
var a;
console.log(a);
a=1;
console.log(b);
4.如下代码的输出?为什么
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name);
}
var sayAge = function(age){
console.log(age);
};
5.如下代码的输出?为什么
function fn(){}
var fn = 3;
console.log(fn);
相当于
var fn;
function fn(){}
fn = 3;
console.log(fn);
输出为3
6.如下代码的输出?为什么
function fn(fn2){
console.log(fn2);
var fn2 = 3;
console.log(fn2);
console.log(fn);
function fn2(){
console.log('fnnn2');
}
}
fn(10);
以上代码相当于
function fn(fn2){
var fn2;
function fn2(){
console.log('fnnn2');
}
console.log(fn2);//按顺序来,此时输出的为函数
fn2 = 3;
console.log(fn2);//3
console.log(fn);//此时输出的为fn函数
}
fn(10);
7.如下代码的输出?为什么
var fn = 1;
function fn(fn){
console.log(fn);
}
console.log(fn(fn));
此代码相当于
var fn;//此时fn为变量
function fn(fn){
console.log(fn);
}//此时fn为函数
fn = 1;此时fn为1
console.log(fn(fn)); //相当于console.log(1(1));
1当然不是函数啦,结果必然报错。
Uncaught TypeError: fn is not a function
8.如下代码的输出?为什么
//作用域
console.log(j);
console.log(i);
for(var i=0; i<10; i++){
var j = 100;
}
console.log(i);
console.log(j);
此代码相当于
var i;
var j;
console.log(j); //定义了未赋值,undefined
console.log(i); //定义了未赋值,undefined
for(i=0; i<10; i++){
j = 100;
}
console.log(i); //10
console.log(j);//100
9.如下代码的输出?为什么
fn();
var i = 10;
var fn = 20;
console.log(i);
function fn(){
console.log(i);
var i = 99;
fn2();
console.log(i);
function fn2(){
i = 100;
}
}
此代码相当于
var i;
var fn;
function fn(){
var i;
function fn2(){
i = 100;
}
console.log(i); //定义了变量,未执行函数,undefined
var i = 99;//此处为局部变量i=99;
fn2(); //调用函数,i=100
console.log(i); //i=100;
}
fn();
i = 10;
fn = 20;
console.log(i);//i=10
10.如下代码的输出?为什么
var say = 0;
(function say(n){
console.log(n);
if(n<3) return;
say(n-1);
}( 10 ));//此为自执行函数,参数为10,执行到2时结束函数。
console.log(say);//自执行函数相当于闭包。不影响全局。由上面定义的可知,var say =0,输出为0.