一、JavaScript
1、window return问题
1.1把a变量甩到全局去了。
function abc() {
window.a = 3
}
abc()
console.log(a)//3 可以访问到a
思考:return能不能通过window实现这个功能呢
function test() {
var a = 1
function add() {
a++
console.log(a)
}
window.add = add//把add函数保存给了全局变量add
}
test()
add()//2
add()//3
add()//4
上面也形成了闭包。也就是return和window可以实现同样的功能。
1.2让一个变量等于一个立即执行函数,函数内部返回一个add内部的函数。然后把函数add交给变量add,保存到了全局。
var add = (function test() {
var a = 1
function add() {
a++
console.log(a)
}
return add //return出去以后,总是要有个全局变量去保存。
})()
add() //2
add() //3
add() //4
1.2.1用window把它丢出去,执行
(function test() {
var a = 1
function add() {
a++
console.log(a)
}
window.add = add //return出去以后,总是要有个全局变量去保存。
})()
add() //2
add() //3
add() //4
总结:return必须把内部的函数赋值给一个全局变量,然后通过全局变量来执行这个函数。
**而window不需要,直接window.add就是全局变量。直接在函数的内部就可以保存。保存以后直接在外界就可以执行。**这就是区别
2、js插件的写法
最外层有一个立即执行函数,然后写一个构造函数,最后把构造函数保存在window的一个变量。
在外界就可以new的到。
(function(){
function Test(){
}
window.Test=Test
})()
var test =new Test();
外层写立即执行函数,是为了防止变量污染。包括函数作用域的污染。
外层用一个立即执行函数包括,可以把作用域限制到内部。外界无法访问。
下面报错:
(function () {})()
(function () {})()
(function(){})()
这样就不报错了
;(function () {})()
;(function () {})()
;(function () {})()
只有表达式才可以立即执行。
+ function(){
console.log(1)
}();
作业:写一个插件,任意传两个数字,调用插件内部方法进行加减乘除功能。
;(function () {
function Test(opt) {
this.firstNum = opt.firstNum
this.secondNum = opt.SecondNum
}
Test.prototype = {
plus: function () {
console.log(this.firstNum + this.secondNum)
},
minus: function () {
console.log(this.firstNum - this.secondNum)
},
muls: function () {
console.log(this.firstNum * this.secondNum)
},
div: function () {
console.log(this.firstNum / this.secondNum)
}
}
window.Test = Test
})()
var test = new Test({
firstNum: 4,
secondNum: 2
})
test.plus()
test.minus()
test.muls()
test.div()
输出一直是NaN。