3.只有表达式才能被执行符号执行,能被执行符号执行的表达式,这个函数的名字就会被自动忽略。被执行符号执行的表达式就变成了立即执行函数。
例1:
var test = function (){ //函数表达式。test是变量名,这个函数执行完后。就被永久的放弃了,就没了。再执行test结果就是undefined,test()就是报错。
console.log('a');
}() // 执行符号就是(),()之前的只有是表达式才能被执行符号执行,这个例子是函数表达式,所以能被执行符号执行。还有()后面加不加;都行。
例2:
+ function test() { // 加上+号或者-号或者!或者与或非能行 不过前面得加东西符合与或非使用规则,加上以上就是表达式,所以能被执行符号执行。
console.log('a');
}();
例3: (function test(){}) //函数声明被包起来了,是表达式。
例4:(w3c建议使用的方式)
(function test(){ //因为test是执行完然后就被释放了,再执行就会报错,所以函数名就可以不写了(立即执行函数的演变过程)
console.log('a');
}()) //这些括号先识别外边的,只有最外层的是数学运算小括号,剩下的所有括号都是有语法意义的。所以最外面的括号会将里面的东西变成表达式,表达式正好被执行符号执行。这个函数执行位置不在它定义位置。17:44 2018/6/24
例5:
function test(a,b,c,d){
console.log(a + b + c + d);
}(1,2,3,4); //系统不报错也不执行,它会将前面的函数声明与后面的 (1,2,3,4)当作两个语句分开,再执行。
48.利用闭包问题解决闭包(必须记住这个,怎么触发,怎么解决等)
1.
function test(){ //test函数中一共有两个变量,arr与i
var arr = [];
for(var i = 0; i < 10; i ++){ //不管中间怎么执行的,最后i的值就为10(i = 10才能结束循环,执行完函数)
arr[i] = function(){ //只是将函数赋给arr[i],函数中内容什么的不管,只有执行时才会考虑,所以函数中的i并不是1,2,3,4等等,不随着arr[i]变化,函数定义时不用看里面的东西,没有意义,当函数执行时再找里面的东西。
document.write(i + " "); //系统只是将一个引用抛进去了,其中内容是什么不知道,只有当执行时才会考虑i到底是什么,系统执行时就是将一个函数抛进去了,但是函数内容是什么并不知道
}
}
return arr; // arr中存放的是十个不同的相互独立的,但是长得一样的函数。
}
var myArr = test(); //这时才会真正执行那个arr[i](一共10个函数)
for(var j = 0;j < 10;j ++){
myArr[j](); //才会真正访问test作用域,并且因为所有函数都是访问一个作用域,所以访问的都是一个i值所以输出结果为10个10
}
2.(对1的更改,只有这一种解法!!!)
function test (){
var arr = [];
for(var i = 0 ; i < 10; i ++){
(function (j){ //立即执行函数立即被执行,里面的语句一条一条被执行
arr[j] = function (){ //这只是赋值语句,但并不代表这个函数就要执行,就像1中一样。
document.write( j + " ");
}
}(i))
}
return arr;
}
var myArr = test();
for( var j = 0; j < 10; j ++){
myArr[j]();
}
3.
for(var a = 0; a < 10; a ++){
}
console.log(a); //可以打印出a = 10;
例1:
var test = function (){ //函数表达式。test是变量名,这个函数执行完后。就被永久的放弃了,就没了。再执行test结果就是undefined,test()就是报错。
console.log('a');
}() // 执行符号就是(),()之前的只有是表达式才能被执行符号执行,这个例子是函数表达式,所以能被执行符号执行。还有()后面加不加;都行。
例2:
+ function test() { // 加上+号或者-号或者!或者与或非能行 不过前面得加东西符合与或非使用规则,加上以上就是表达式,所以能被执行符号执行。
console.log('a');
}();
例3: (function test(){}) //函数声明被包起来了,是表达式。
例4:(w3c建议使用的方式)
(function test(){ //因为test是执行完然后就被释放了,再执行就会报错,所以函数名就可以不写了(立即执行函数的演变过程)
console.log('a');
}()) //这些括号先识别外边的,只有最外层的是数学运算小括号,剩下的所有括号都是有语法意义的。所以最外面的括号会将里面的东西变成表达式,表达式正好被执行符号执行。这个函数执行位置不在它定义位置。17:44 2018/6/24
例5:
function test(a,b,c,d){
console.log(a + b + c + d);
}(1,2,3,4); //系统不报错也不执行,它会将前面的函数声明与后面的 (1,2,3,4)当作两个语句分开,再执行。
48.利用闭包问题解决闭包(必须记住这个,怎么触发,怎么解决等)
1.
function test(){ //test函数中一共有两个变量,arr与i
var arr = [];
for(var i = 0; i < 10; i ++){ //不管中间怎么执行的,最后i的值就为10(i = 10才能结束循环,执行完函数)
arr[i] = function(){ //只是将函数赋给arr[i],函数中内容什么的不管,只有执行时才会考虑,所以函数中的i并不是1,2,3,4等等,不随着arr[i]变化,函数定义时不用看里面的东西,没有意义,当函数执行时再找里面的东西。
document.write(i + " "); //系统只是将一个引用抛进去了,其中内容是什么不知道,只有当执行时才会考虑i到底是什么,系统执行时就是将一个函数抛进去了,但是函数内容是什么并不知道
}
}
return arr; // arr中存放的是十个不同的相互独立的,但是长得一样的函数。
}
var myArr = test(); //这时才会真正执行那个arr[i](一共10个函数)
for(var j = 0;j < 10;j ++){
myArr[j](); //才会真正访问test作用域,并且因为所有函数都是访问一个作用域,所以访问的都是一个i值所以输出结果为10个10
}
2.(对1的更改,只有这一种解法!!!)
function test (){
var arr = [];
for(var i = 0 ; i < 10; i ++){
(function (j){ //立即执行函数立即被执行,里面的语句一条一条被执行
arr[j] = function (){ //这只是赋值语句,但并不代表这个函数就要执行,就像1中一样。
document.write( j + " ");
}
}(i))
}
return arr;
}
var myArr = test();
for( var j = 0; j < 10; j ++){
myArr[j]();
}
3.
for(var a = 0; a < 10; a ++){
}
console.log(a); //可以打印出a = 10;