说一下对变量提升的理解
- 变量定义
- 函数声明(注意和函数表达式的区别)
说明this几种不同的使用场景
- 作为构造函数执行
- 作为对象属性执行
- 作为普通函数执行
- call apply bind
创建10个<a>标签,点击的时候弹出来对应的序号
var i
for(i=0;i<10;i++){
(function(i){
var a = document.createElemnet('a')
a.innerHTML = i + '<br>'
a.addEventListenter('click',function(e){
e.preventDefault()
alert(i)
})
document.body.appendChild(a)
})(i)
}
如何理解作用域
- 自由变量
- 作用域链,即自由变量的查找
- 闭包的两个场景(示例代码在下方)
实际开发中闭包的应用
//闭包实际应用中主要用于封装变量,收敛权限
function isFirstLoad (){
var _list = []
return function (id) {
if( _list.indexOf (id)>=0){
return false
}else {
_list.push(id)
return true_
}
}
}
//使用
var firstLoad = isFirstLoad()
firstLoad (10) //true
firstLoad (10) //false
firstLoad (20) //true
知识点
执行上下文
- 范围:一段<script>或者一个函数
- 全局:变量定义、函数声明
- 函数:变量定义、函数声明、this、argumentsps:
ps:注意‘函数声明‘和‘函数表达式的区别
this
this要在执行时才能确认值,定义时无法确认
var a = {
name: 'A',
fn:function(){
console.log(this.name)
}
}
a.fn() //this === a
a.fn.call({name:'B'}) //this === {name:'B'}
var fn1 = a.fn
fn1() //this === window
- 作为构造函数执行
- 作为对象属性执行
- 作为普通函数执行
- call apply bind
// call apply bind
function fn1 (name,age){
alert(name)
}
fn1.call({x:100},'zhangsan',20) //this === {x:100}
fn1.apply({x:100},['zhangsan',20]) //this === {x:100}
var fn2 = function (name,age){
alert(name)
console.log(this)
}.bind({y:20})
fn2('zhangsan',20) //this === {y:20}
作用域
- 没有块级作用域
- 只有函数和全局作用域
闭包的使用场景
- 函数作为返回值
-
function F1 (){ var a = 100 return function (){ console.log(a) //自由变量,父作用域寻找 } } var f1 = F1() var a = 200 f1() //100 - 函数作为参数来传递
-
function F1(){ var a = 100 return function(){ console.log(a)//自由变量,父作用域寻找 } } var f1 = F1() function F2(fn){ var a = 200 fn() } F2(f1) //100
本文深入解析JavaScript中的变量提升、作用域链、闭包原理及其实战应用,涵盖this的不同使用场景,通过实例帮助读者理解自由变量的查找机制和闭包在实际开发中的重要性。
166

被折叠的 条评论
为什么被折叠?



