fun()
function fun(){
console.log('可以运行哦!')
}
但是函数表达式提前调用会报错
fun1() //会报错,fun1 is not a function
var fun1=function(){
console.log('不可以在此之前调用函数fun1哦')
}
这是因为函数表达式中,fun1会执行变量提升,因此在赋值之前提升为var fun1=undefined 因此在函数表达式之前调用会出错。
函数声明结构如下
function fib(n){
if(n===1 || n===2){
return n
}else{
return fib(n-1)+fib(n-2)
}
}
console.log(fib(9))
但是使用函数表达式的时候会存在一些问题
function fib(n){
if(n===1 || n===2){
return n
}else{
return fib(n-1)+fib(n-2) // 在fib赋值为null的时候会出错
}
}
var fib1=fib
fib=null
console.log(fib1(9))
此时,可以使用arguments.callee()来解决这个问题,arguments.callee()指向正在运行的函数。但是在严格模式下会出错。可以通过一个匿名函数来解决
function fib(n){
if(n===1 || n===2){
return n
}else{
return arguments.callee(n-1)+arguments.callee(n-2)
}
}
var fib1=(fib)
fib=null
console.log(fib1(9))
// 使用命名函数解决这一问题
var fib2=(function f(n){
if(n===1 || n===2){
return n
}else{
return f(n-1)+f(n-2)
}
})
console.log(fib2(9))
闭包是指有权限访问另一个函数作用域中变量的函数。
全局函数中的this指向window,当函数被作为某个对象的方法调用时,this等于那个对象,但是匿名函数的执行环境具有全局性,其this通常指向window。
要想使得匿名函数指向其外部函数的this,可在其外部定义一个变量指向this,在闭包内部引用该变量。如下:
var name="window"
var obj={
name:'obj',
getName:function(){
var that=this
return function(){
console.log(that.name)
/**
* 注意这段代码如果在node环境下运行时,会输出undefined
*/
}
}
}
原文:https://www.cnblogs.com/ailingstar/p/12459354.html