js函数和作用域链
一、函数声明和函数表达式
函数声明的形式:function fn() { } ,使用函数声明的形式声明一个函数时,会先进行函数声明前置,所以function声明可以放在全局作用域中的任何一个位置,调用函数也不一定硬性要求一定要放在声明函数之后。函数表达式的形式: var fn= function() { } ,使用函数表达式声明一个函数的时候,声明前置和var无差,就是先前置var fn ,所以后面要调用函数的时候,一定要在函数声明后才能调用该函数。
二、变量的声明前置和函数声明前置
变量的声明前置就是在解释代码时,先把 全局作用域的变量先提升到头部 例如var a;
函数声明前置就是在解释代码时,先把函数的声明前置如 function fn ( );
函数内部声明前置是在执行函数体时,先前置函数内部的所有声明的变量;
三、argument
argument 是一个类数组对象,但并不是一个数组对象;在函数体内可以通过argument对象来访问传递给该函数的所有参数 如argument[0]访问第一个参数;argument[1] 访问第二个参数,以此类推。
四、js函数没有重载
在其他语言中,例如C语言、JAVA语言等都有函数重载的功能,就是定义两个名字一样的函数,但是函数的参数类型不一致,当再需要调用此函数时,会根据传入到调用函数参数类型不同,自动地调用相关函数。js没有函数重载
五、立即执行函数表达式
(function ( ) { })( ); 隔离作用域
六、用递归实现 n! 的运算
递归就是在函数内部自己调用自己
function factor(n) {
if(n ==1) {
return1;
}else{
returnn*factor ( n-1);
}
}
八、写一个函数输出参数的平方和:
function sumOfSquare() {
var result=0;
for(vari=0;i < arguments.length;i++) {
result +=arguments[i]*arguments[i];
}
return result;
}
九、
console.log(a); // undefined
var a =1; console.log (b); //报错
十、
sayName('world');
sayAge(10);
functionsayName(name){
console.log('hello ', name); // hello world
}
var sayAge =function(age){
console.log(age); //报错,因为用函数表达式声明函数,调用要在函数声明后才能生效
};
十一、
var x =10;
bar()
function foo(){
console.log(x) // 10
}
functionbar() {
var x =30
foo()
}
作用域链:
globalContext ={
AO { x:110,
foo:function() { },
bar:function( ) { }
}
scope:null
}
foo.[[scope]]=globalContext.AO
bar.[[scope]]=globalContext.AO
barContext ={
AO { x:30}
bar.[[scope]]=globalContext.AO
}
fooContext ={
AO {}
foo.[[scope]]=globalContext.AO
}
十二、
var x =10;
bar()
functionbar() {
var x =30;
functionfoo() {
console.log(x); //30
}
foo();
}
作用域链:
globalContext ={
AO {x: 10,
bar: function() { },
}
}
bar.[[scope]]=globalContext.AO
barContext ={
AO { x:30,}
foo: function() { },
}
bar.[[scope]]=globalContext.AO
}
foo.[[scope]]=barContext.AO
fooContext ={
AO { },
foo.[[scope]]=barContext.AO
}
十三、
varx =10;bar()functionbar(){varx =30; (function(){console.log(x)//30})()}
作用域链:
globalContext = {
AO {x:10,
bar:function() { }
}
}
bar.[[scope]]=globalContext.AO
barContext = {
AO { x: 30}
bar.[[scope]]=globalContext.AO
}
十四、
var a =1;
functionfn() {
console.log(a) //undefined
var a =5;
console.log (a); //5
a++;
var a;
fn3()
fn2()
console.log(a); //6
function fn2() {
console.log(a) // 6a =20
}
}
function fn3() {
console.log(a) //1
a =200
}
fn()
console.log(a) //20
`
作用域链:
globalContext ={
AO { a:20,
fn:function() { },
fn3:function( ) { }
}
}
fn.[[scope]]=globalContext.AO
fn3.[[scope]]=globaContext .AO
fnConntext = {
AO {a:6,
fn2:function( ) { },
}
fn.[[scope]]=globalContext.AO
}
fn2.[[scope]]=fnContext.AO
fn3Context ={
AO { },
fn3.[[scope]] = globalContext.AO
}
fn2Context = {
AO { }
fn2.[[scope]]=fnContext.AO
}