for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i) // 5 5 5 5 5
}, 0)
}
for (var i = 0; i < 5; i++) {
// 利用 IIFE 创建一个函数作用域
(function() {
// 用一个变量把时下的 i 保存在函数作用域内
var j = i
setTimeout(function() {
console.log(j)
}, 0)
})()
}
for (var i = 0; i < 5; i++) {
// let 创建了一个块级作用域,用于回调函数捕获
let j = i
setTimeout(function() {
console.log(j)
}, 0)
}
for (let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i)
}, 0)
}
function FooModule() {
var name = 'bar'
function sayHello() {
console.log(`Hello, ${name}`)
}
return {
sayHello
}
}
var foo = FooModule()
foo.sayHello() // Hello, bar
var fooModule = (function() {
var name = 'bar'
function sayHello() {
console.log(`Hello, ${name}`)
}
return {
sayHello
}
})()
fooModule.sayHello() // Hello, bar
var MyModules = (function () {
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,
get
}
})()
MyModules.define('foo', [], function() {
function hello(name) {
console.log(`Hello, ${name}`)
}
return {
hello
}
})
MyModules.define('bar', ['foo'], function(foo) {
function helloFromBar() {
foo.hello('bar')
}
return {
helloFromBar
}
})
var bar = MyModules.get('bar')
bar.helloFromBar() // Hello, bar