全局变量的声明
- 全局变量的声明
var
声明全局变量
在函数体外部使用var
声明全局变量,在函数体内部使用var
声明的为局部变量。
var age= 5//全局变量
function test(){
var myAge = 1;//局部变量
}
- 直接声明
不使用var
的变量,无论位置在何处均为全局变量
age = 5//全局变量
function test(){
myAge = 1//全局变量
}
window
声明
在JS中直接使用window
声明为全局变量
window.age = 5//全局变量
函数的声明
- 函数声明
function name(){}
函数声明进行函数提升 - 函数表达式
var name = function(){}
函数表达式/匿名函数可立即执行
(function(){
return name //"jojo"
})("jojo")
(function (name){
return name //"jojo"
}("jojo"))
(var getName = function(name){
return name //"jojo"
})("jojo")
变量提升、函数提升
- 变量声明提升
- Js定义一个变量的过程,变量声明提升到作用域顶部,按顺序执行并赋值。
- 例子:
function test(){
var a = 1
console.log(a)
console.log(b)
var b = 2
}
- 解释
function test(){
var a
var b
a = 1
console.log(a)//1
console.log(b)//undefined
b = 2
}
- 函数整体提升
- Js函数整体提升,与变量声明提升类似,剪切提升到作用域顶部
- 注:只有函数声明式
function name(){}
才可提升,函数表达式var name = function(){}
不可 - 例:
function foo() {
console.log(a);
var a = 1;
console.log(a);
function a() {}
console.log(a);
}
foo();
- 解释
function foo(){
var a
function a(){}
console.log(a)//a()
a = 1
console.log(a)//1
console.log(a)//1
}
foo()
闭包
- 闭包的形成
- 闭包哟做桥梁,将函数内部和外部链接。
- 函数作用域:Js函数创建会形成独立作用域,作用域内可以读取外部的全局变量, 但外部无法读取函数内的局部变量。作用域层级包含,子作用域可以访问父级作用域,反之不可。
var m = 1
function f(){
var n = 0
m //1
}
n //undefined
- 为了访问函数内局部变量,在函数内部定义一个函数(闭包),访问父级作用域的变量并返回。
function Father(){
var n = 1
function Son(){
return n //1
}
return Son
}
- 闭包的用途
- 访问函数内部变量
- 让变量保存在内存中
使用c
引用闭包,因此c
不会被垃圾回收,闭包也就一直存在与内存中
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c=a();
c(); // 1
c(); // 2
a()() //1
a()() //1
- 注意:
- 闭包使函数中变量存在内存中,性能影响
- 使用
null
解除引用,垃圾回收
闭包的this
指向
在Js中this
永远指向函数的执行环境。
var name = "The Window";
var object = {
name: "My object",
getNameFunc: function() {
return function() {
return this.name;
};
}
}
alert(object.getNameFunc()()); // "The Window"
object.getNameFunc() //此时this指向"My Object"
object.getNameFunc()()//指向"The Window"
为什么匿名函数不能取得外部作用域的this对象?
每个函数被调用时,其活动对象会自动获取this和arguments。
内部变量搜索this和arguments时,只会搜索到其活动对象为止,
因此永远无法访问外部的this和arguments
——《JavaScript高级程序设计》
办法:
var name = "The window"
var obj = {
name = "My obj"
getNameFunc: function(){
var that = this
return function(){
return that.name
}
}
}