JavaScript之经典面试题

1、作用域经典面试题
 var num = 123;
    // f1函数写好了,作用域就定下来了,也就是作用域链定下来了
    // f1函数作用域链: f1函数作用域 ==> 全局作用域
    function f1() {
        console.log(num); // 123
    }
    function f2() {
        var num = 456;
        f1();
    }
    f2(); //打印啥?
   
 var num = 123
    function f1(num) {
        // 形参:理解成函数内声明的局部变量
        //  var num = 实参; 456
        console.log(num) // 456
    }
    function f2() {
        var num = 456;
        f1(num); // num实参   f1(456)
    }
    f2()

 

 var num = 123
    function f1(num) {
        // var num = 实参; // undefined
        console.log(num); // undefined
    }
    function f2() {
        var num = 456;
        f1();
    }
    f2()

 

var num = 123
    function f1() {
        console.log(num); // 123
    }
    function f2() {
        var num = 456;
        f1(num);
    }
    f2();

细节:

    //  1. 预解析(函数内的代码执行之前也要预解析)
    //  2. 函数内的形参理解: 理解成函数内声明的局部变量
    //  3. 函数作用域在函数写好的时候就已经确定下来了,作用域链就已经定下来了。
 
var num1 = 10;
    var num2 = 20;
    function fn(num1) {
        // var num3; // 预解析
        // var num1 = 实参; // undefined // 形参的理解
      num1 = 100; // 修改的局部num1为100;
      num2 = 200; // 修改的全局num2为200;
      num3 = 300; // 修改的局部num3为300;
      console.log(num1); // 100
      console.log(num2); // 200
      console.log(num3); // 300
      var num3;
    }
    fn();
    console.log(num1); // 10
    console.log(num2); // 200
    console.log(num3); // error*/

 

var num = 10;
    fn1();
    function fn1() {
        console.log(num); // undefined
        var num = 20;
        console.log(num); //20
    }
    console.log(num); // 10

-------------------------------------------------------------------------------------------分割线--------------------------------------------------------------------------------------------------------

2、预解析经典面试题
   
 function fn1() {
        // 函数内的代码在执行之前也要经过预解析
        var num; // 预解析
        console.log(num); // undefined
        num = 20;         // 修改局部num为20
        console.log(num); // 20
    }
    var num;
 
 
    num = 10;   // 修改全局num为10
    fn1();
    console.log(num); // 10

 

 var num = 10;
    fn1();
    function fn1() {
      console.log(num);  // 10
      num = 20;          // 修改全局的num为20
      console.log(num);  // 20
    }
    console.log(num);    // 20

 -------------------------------------------------------------------------------------------分割线-------------------------------------------------------------------------------------------------------------------

 封装console.log功能,封装成clg函数
 
 难点:console.log()里面的参数是不定的;封装的clg函数,形参的个数就无法确定
     
   // 以下代码未完成功能,可以在以下代码基础上完成封装功能
        function clg(str, str2, str3){
            console.log(str, str2, str3);
        }
        clg("哈哈", "嘻嘻", "呜呜", "呜呜", "嘤嘤", "嘿嘿");
        // console.log("哈哈", "嘻嘻", "呜呜", "嘤嘤", "嘿嘿");
        function clg(){
            // console.log(arguments); // 打印arguments整体
            // 打印arguments里面的每一项
            console.log.apply(arguments, arguments);
            // 等价于:
            // arguments.log("哈哈", "嘻嘻", "呜呜", "呜呜", "嘤嘤", "嘿嘿");
        }
        clg("哈哈", "嘻嘻", "呜呜", "呜呜", "嘤嘤", "嘿嘿");
        
在以上clg函数基础上增加功能
        function clg2(){
            // 思路: 给arguments伪数组在头部前面添加  "友情提示:"   unshift()
            // arguments借用unshift方法实现添加功能
            [].unshift.call(arguments, "友情提示:");
            // console.log( arguments );
            // 等价于:
            // arguments.unshift("友情提示:");
            console.log.apply(arguments, arguments);
        }
        // clg2("哈哈", "嘻嘻", "呜呜"); // 打印的时候是这样的 "友情提示:" 哈哈 嘻嘻 呜呜
        // clg2("aa", "bb", "cc", 10);  // 希望:这样调用打印的效果和下面代码效果一样
        // clg2("友情提示:", "aa", "bb", "cc");
 
 
        // 就是封装console.log的时候,第一个参数可以随便写
        //   call apply的第一个参数是用来修改this指向的
        // 求和
        function sum(n1, n2){
            console.log(n1 + n2);
        }
        sum.call(null, 10, 20);
        sum.apply(undefined, [10, 20]);

注:以上内容均为个人学习时所整理笔记

posted @ 2020-09-18 16:47  大熊在这里  阅读(220)  评论(0)    收藏  举报