关于JS

说说今天学的吧

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,'/');

结果: