JavaScript变量与函数

全局变量的声明

  1. 全局变量的声明
  • var声明全局变量
    在函数体外部使用var声明全局变量,在函数体内部使用var声明的为局部变量。
var age= 5//全局变量
function test(){
	var myAge = 1;//局部变量
}
  • 直接声明
    不使用var的变量,无论位置在何处均为全局变量
age = 5//全局变量
function test(){
	myAge = 1//全局变量
}
  • window声明
    在JS中直接使用window声明为全局变量
window.age = 5//全局变量

函数的声明

  1. 函数声明
    function name(){}
    函数声明进行函数提升
  2. 函数表达式
    var name = function(){}
    函数表达式/匿名函数可立即执行
(function(){
	return name //"jojo"
})("jojo")
(function (name){
	return name //"jojo"
}("jojo"))
(var getName = function(name){
	return name //"jojo"
})("jojo")

变量提升、函数提升

  1. 变量声明提升
  • 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
}
  1. 函数整体提升
  • 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()

闭包

  1. 闭包的形成
  • 闭包哟做桥梁,将函数内部和外部链接。
  • 函数作用域: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
}
  1. 闭包的用途
  • 访问函数内部变量
  • 让变量保存在内存中
    使用c引用闭包,因此c不会被垃圾回收,闭包也就一直存在与内存中
function a(){	
  var i=0;
  function b(){
      alert(++i);
  }
  return b;
}
var c=a();
c();  // 1
c();  // 2
a()() //1
a()() //1
  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
		}
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值