作用域和闭包
现有声明后有赋值
声明在编译时会提升位置,提升时函数会优先变量,如果是同名函数顺序排在后面的会覆盖前面的函数
函数表达式:
立即执行的函数表达式
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
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号