现有声明后有赋值
声明在编译时会提升位置,提升时函数会优先变量,如果是同名函数顺序排在后面的会覆盖前面的函数
函数表达式:
立即执行的函数表达式
var a = 2;
(function IIFE(global) {
var a = 3;
console.log(a)//3
})(window);
块作用域和闭包
闭包:
function foo(){
var a = 3;
function bar() {
console.log(a);
}
return bar
}
var baz = foo();
baz() // 3
for(var i = 0; i< 5; i++){
setTimeout(function timer(){
console.log(i);
},i*1000)
}
// 5
// 5
// 5
// 5
// 5
// 不是期待的结果,因为他们要找i的话就要取的同一个i
解决方式
闭包:
for(var i = 0; i< 5; i++){
(function(j){
setTimeout(function timer(){
console.log(j);
},i*1000)
})(i)
}
块作用域:
for(let i = 0; i< 5; i++){
setTimeout(function timer(){
console.log(i);
},i*1000)
}
es6之前模块化:
var foo = (function Greeting() {
function goodMorning(){
console.log("goodMorning");
}
function goodAfternoon(){
console.log("goodAfternoon");
}
function goodEvening(){
console.log("goodEvening");
}
return {
goodMorning:goodMorning,
goodAfternoon:goodAfternoon,
goodEvening:goodEvening
}
})()
var MyMoudles = (function Manager() {
var modules = {};
function define(name,deps,impl){
for(var i=0;i<deps.length;i++){
deps[i]= modules[deps[i]];
}
modules[name]= impl.apply(impl,deps);
}
function get(name){
return modules[name];
}
return {
define:define,
get:get
}
})()
// 添加例子
MyMoudles.define("bar",[],function(){
function hello(who){
console.log("hello!"+who);
}
})
var bar = MyModules.get("bar");
bar.hello("xiao jie jie");
es6模块化:
//bar.js
function hello(who){
console.log("hello!"+who);
}
export hello;
//main.js
// import bar from "bar"
module bar from "bar"
bar.hello("xiao jie jie");
// import 是将一个模块中的一个或者多个api倒入当前作用域中
// module是将整个模块的api导入并绑定到一个变量上
this与词法作用域
this指向问题:
var obj = {
id = "awesome",
cool: function coolFn() {
console.log(this.id);
}
}
var id = "not awesome";
obj.cool();// awesome
setTimeout(obj.cool,100);//not awesome
解决方法:
第一种
var obj = {
count: 0,
cool: function coolFn() {
var self = this;
if(self.count < 1){
setTimeout(function timer(){
self.count++;
console.log("awesome");
},100)
}
}
}
obj.cool();// awesome
第二种
var obj = {
count: 0,
cool: function coolFn() {
if(this.count < 1){
setTimeout(function timer(){
this.count++;
console.log("awesome");
}.bind(this),100)
}
}
}
obj.cool();// awesome
第三种
var obj = {
count: 0,
cool: function coolFn() {
if(this.count < 1){
setTimeout(()=>{
this.count++;
console.log("awesome");
},100)
}
}
}
obj.cool();// awesome