JavaScript初学者笔记 预解析、作用域、函数调用
- 共 609 次检阅

//  函数封装冒泡排序
function sort(arr) {
    for (var i = 0; i < arr.length - 1; i++) {
        for (var j = 0; j < arr.length - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                var temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    return arr;
}

var re = sort([11, 12, 13, 4, 7, 6, 5, 4, 3])
console.log(re);

function isRunYear(year) {
    //如果是闰年我们返回true;否则返回false
    var flag = false;
    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
        flag = true;
    }
    return flag;
}


function backDay() {
    var year = prompt('请输入年份:');
    if (isRunYear(year)) {
        alert('当前年份是闰年二月份二十九天');
    } else {
        alert('当前年份是平年二月份有二十八天');
    }
}

backDay();


// javascript 作用域:代码名字(变量)在某个范围内其效果,目的是减少命名冲突
// js的作用域(es6):q全局作用域,局部作用域
// 全局作用域:整个script标签,或者是一个单独的js文件
// 局部作用域(函数内部)
// 函数内部 没有声明直接赋值的变量也属于全局变量
var num2 = 30;
function fn() {
    num2 = 30;
    console.log(num2);
}
fn();

// 变量的作用域:全局变量和局部变量
var num10 = 10; // num10是一个全局变量
console.log(num10);
function fr() {
    console.log(num10);
}
fr();

//局部变量
// 函数的形参也可以看做是局部变量
function fh() {
    var num11 = 10; // num11就是局部变量 只能在函数内部使用
}
fh();

// 从执行效率来看局部变量和局部变量
// 全局变量只有浏览器关闭的时候才会销毁,比较占内存资源
// 局部变量执行完过后直接销毁,减少占用内存资源  


// 作用域链 :内部函数访问外部函数的变量,采取的是链式查找的方式来决定取那个值,这种结构我们陈志伟作用域链,就近原则
var num11 = 10;
function fns() {
    var num11 = 23;
    function fnss() {
        console.log(num11);
    }
    fnss();
}
fns();

//作用域案例 输出结果是几?
function f11() {
    var num12 = 123;
    function f12() {
        console.log(num12);
    }
    f12();
}
var num12 = 456;
f11();

// 作用域案例 输出结果是几?
var a = 1;
function f13() {
    var a = 2;
    var b = '22';
    f15();
    function f15() {
        var a = 3;
        f16();
        function f16() {
            var a = 4;
            console.log(a);
            console.log(b);
        }
    }
}
f13();

// 预解析
// 一,我们js引擎运行js 分为两步:预解析 ,代码执行
// 1.预解析js引擎会把js里面的所有的var 还有funcution 提升到当前作用域的最前面
// 2.代码执行,按照代码书写的顺序从上往下执行
// 二,预解析氛围变量预解析(变量提升)和函数预解析(函数提升)
// 1.变量提升:就是把所有的变量声明提升到当前的作用域最前面,不提升赋值操作
// 2.函数提升:就是把所有的函数声明提升到当前作用域的最前免,不调用函数
f17();
console.log(c);
console.log(b);
console.log(a);
function f17() {
    var a = b = c = d = 9;
    console.log(a);
    console.log(b);
    console.log(c);
}

// 预解析
function f17() {
    //相当于:var a = 9 ;b=9;c=9; b和c直接赋值,属全局变量
    var a = b = c = d = 9;
    var a;
    a = b = c = 9;
    console.log(a); // 输出 9
    console.log(b); // 输出 9
    console.log(c); // 输出 9
}
fn17();
console.log(c); // 输出 9
console.log(b); // 输出 9
console.log(a); // 输出报错

 

分享到:

这篇文章还没有评论

发表评论