说说今天学的吧
1.JS的全局作用域和局部作用域
很简单,定义的变量在函数里面的则是局部作用域,其余的则是全局作用域。在函数中如果直接写 i = 10;没有var也表示全局作用域。
2.匿名函数定义为函数表达式
首先说一下声明函数,匿名函数以及函数表达式的区别
(1)声明函数:使用function关键字 + 函数名声明的函数
function test(){}(2)匿名函数:使用function关键字但是没有函数名的函数
function(){}(3)函数表达式:使用function关键字没有函数名,赋值给一个变量的函数。可以使用()操作符,表示立即执行
var j = function(){} var j = function(){ }()//立即执行那么怎么把匿名函数定义为函数表达式并立即执行呢
(function(){ console.log('haha') })();第一个()表示把匿名函数定义成函数表达式,第二个()表示立即执行
3.预解析和作用域
举一些例子吧
function fn1(){ console.log(a) function fn2(){ var a = 20; console.log(a) } fn2(); var a = 30; console.log(a) } fn1();结果
首先看第一个console.log(a),在函数里面,往上找无法找到给变量a定义的值,所以出来undefined。再看第二个console.log(a),他在fn2函数里面,所以在fn2里面找,它的上面定义了a = 20;所以输出20;同理第三个输出30;
注意:函数内部的变量对外部是不可见的,函数内部可以访问外部函数的变量。
再举个例子
var j = function(){ var max = 10; var i = function(){ console.log(max); return max; } return i; } console.log(j);这个程序最后会输出function j();
我们来看一下JS是怎么运作的:由于这个程序我并没有给予他们运作的功能,所以他们只会自己运作,但不会反馈出来。所以最后的console.log(j)只会出来j声明的函数。那么如果我们把最后改成console.log(j()),让j声明的函数运作一下,那么最后自然会返回i声明的函数,即function i()。再来,如果最后改成console.log(j()()),同理,让i声明的函数运作,最后将会返回10.
最后写一下今天的一个小练习吧
关于加减乘除的
function computer(){ var num = arguments[arguments.length - 1]; var sum = arguments.length if (num == '+') { for (var i = 1; i < sum-1; i++) { arguments[0] += arguments[i] }; console.log(arguments[0]) }else if(num == '-'){ for (var i = 1; i < sum-1; i++) { arguments[0] -= arguments[i] }; console.log(arguments[0]) }else if(num == '*'){ for (var i = 1; i < sum-1; i++) { arguments[0] *= arguments[i] }; console.log(arguments[0]) }else if(num == '/'){ for (var i = 1; i < sum-1; i++) { arguments[0] /= arguments[i] }; console.log(arguments[0]) } } computer(5,6,8,'+'); computer(25,6,8,'-'); computer(5,6,8,'*'); computer(30,5,6,'/');结果:

