函数声明和函数表达式有什么区别 (*)
function printName(){
console.log('Byron');
}//函数声明
var printName = function(){
console.log('Byron');
};//函数表达式
- 函数声明后面没有分号,而表达式有分号。
- 函数声明会前置,而表达式不会。
- 一般推荐使用函数声明,不用表达式。
什么是变量的声明前置?什么是函数的声明前置 (**)
- 声明前置,就是在一个作用域块中,所有的变量都被放在块的开始出声明。
- 函数的声明前置,是指在一个作用域块中,把函数提到前面最先解析。
arguments 是什么 (*)
arguments 是一个类数组对象。代表传给一个function的参数列表。
arguments 是一个对象它可以获取该函数所有的参数(实参&&传参) console.log(arguments);可以打印出你所传入的所有参数且以酷似数组的形式出现.
arguments对象仅在函数内部有效,在函数外部调用 arguments 对象会出现一个错误。
如果你调用一个函数,当这个函数的参数数量比它显式声明的参数数量更多的时候,你就可以使用 arguments 对象。这个技术对于参数数量是一个可变量的函数来说比较有用。 你可以用 arguments.length来得到参数的数量,然后可以用 arguments object 来对每个参数进行处理。(想要得到当一个函数定义时的该函数的参数数量, 请使用 Function.length
属性。)
function sum(){
var sum = 0;
for(var i=0;i<arguments.length;i++){
sum = sum + arguments[i];
}
return sum;
}
console.log( sum(1,2,3) );
函数的重载怎样实现 (**)
在js中没函数重载。如果用其他语言中的重载写在js里的话,后者会覆盖前者。
function sum(a,b){
return a + b;
}
function sum(a,b,c){
return a + b + c;
}
console.log( sum(1,2) ); //NaN
在js里可以用arguments对象来实现酷似重载。
function sum(){
var sum = '';
for(var i=0;i<arguments.length;i++){
sum = sum + arguments[i];
}
return sum;
}
立即执行函数表达式是什么?有什么作用(***)
立即调用函数表达式常见的有两种写法:
(function(){} ());
(function(){})();
立即执行函数可以将写在函数体内的语句直接执行。区别于普通语句,立即执行函数内的变量不会干扰函数体外,形成一个类似区块的空间。
(function() {
c =1 ;
console.log(c)
})();
是否会前置呢??????
实验1
console.log(fn);
(function fn() {
c =1 ;
console.log(c)
})();
、、、
console.log(fn);
function fn() {
c =1 ;
console.log(c)
};
、、、
什么是函数的作用域链 (****)
- JavaScript的作用域是靠函数来形成的,也就是说一个函数内定义的变量函数外不可以访问(只有函数)
- 不加var会变成全局变量
- 在代码执行的过程中,所有用到的变量会在当前作用域中进行寻找,如果找不到,就会往沿着作用域链向上一级进行寻找,一直到全局作用域为止,如果找到便会停止(而不理会上一级是否有同名的变量),如果找不到,就会报错。
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, '男'); //name:"hunger" age:28 sex:"男" [object Arguments]
getInfo('hunger', 28);//name:"hunger" age:28 undefined
getInfo('男');
2.写一个函数,返回参数的平方和?如
(难度**)
function sumOfSquares(){
var sum = 0;
for(i=0;i<arguments.length;i++){
sum = sum + arguments[i]*arguments[i];
}
console.log(sum);
return sum;
}
sumOfSquares(2,3,4); // 29
sumOfSquares(1,3); // 10
3.如下代码的输出?为什么 (难度*)
console.log(a); //undefined -------------声明前置----------
var a = 1;
console.log(b);//报错---------------未声明------------------
4.如下代码的输出?为什么 (难度*)
sayName('world'); //"hello world"
sayAge(10); //VM3032:2 Uncaught TypeError: sayAge is not a function
function sayName(name){
console.log('hello ', name);
} -----------------------函数声明前置------------------
var sayAge = function(age){
console.log(age);
};----------------------函数声明前置---------------
5.如下代码的输出?为什么 (难度**)
function fn(){}
var 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=10;
//function fn2(){
//console.log('fnnn2');
// }
console.log(fn2); ----------function-----------
var fn2 = 3;
console.log(fn2); ------------3----------------
console.log(fn);-------------function-----------
}
7.如下代码的输出?为什么 (难度***)
var fn = 1;
function fn(fn){ console.log(fn); }
console.log(fn(fn));//报错fn不是一个函数,函数声明前置,fn=1覆盖fn函数。
8.如下代码的输出?为什么 (难度**)
//作用域
console.log(j); //undefined
// 需要注意的是,for是属于运算符,不属于函数,
//所以在其内部定义的变量和当前属于同一个作用域。
//在JS中只有函数内部使用var定义,才具备另一个作用域性质。
console.log(i);//undefined
for(var i=0; i<10; i++){
var j = 100;
}
console.log(i); //10
console.log(j);//100
9.如下代码的输出?为什么 (难度****)
fn(); //执行fn()
//function fn(){
//console.log(i);-------------------声明未赋值undefined-------
//var i = 99;
//fn2();
//function fn2(){
// i = 100;----------------全局变量-----------
// }
//console.log(i); -----------------------100------------------
var i = 10;
var fn = 20;
console.log(i);------------------------10--------------------
function fn(){
console.log(i);
var i = 99;
fn2();
console.log(i);
function fn2(){
i = 100;
}
}
10.如下代码的输出?为什么 (难度*****)
var say = 0;
(function say(n){
//var n = 10;
console.log(n); //---------------------------10-----------------------
if(n<3)return; //跳出循环
say(n-1);//----9----8----7----6----5----4----3----2
}( 10 ));
console.log(say);//-------------------------0---------------------