• js面试程序题及详解


    题目都来自论坛、博文,经本人用chrome中的console再次测验得出。不足之处请指正~~

    1.

    var f = function g() {
            return 23;
        };
    typeof g(); 
    

    error;  运行f()为23;

    2.

    (function (x) {
        delete x;
        return x;
    })(1);
    
    delete操作符用来删除对象的属性,删不掉的包括:
    1.变量;  //var name = "Lily";
    2.原型当中的变量;  //fun.prototype.age = 18;
    3.函数
    4.函数内建的arguments对象;

    答案:1

    3.

    (function f(f) {
        return typeof f();
    })(function () {
        return 1;
    });
    

    “number”

    4.

    var a = 1;
    function hi(){
        alert(a);
        var a;
    }
    hi();

    答案:undefined

    5.javascript词法分析、连续赋值

    var foo = {n:1};
    var bar = foo;
    foo.x = foo = {n:2};
    console.log(foo.x); 
    console.log(bar.x);

    答案:undefined和{n:2}

    考点:词法分析、执行顺序、运算符优先级等

    6.词法分析

    function a(b){
       alert(b);
       function b(){
           alert(b);
       }
       b();
    }
    a(1);

    答案:弹出两个

    function b(){
    alert(b);
    }

    分析过程:
    形成活动对象AO={}
    分析形参,--> AO={b:undefined}; 分析传参,--> AO={b:1}
    分析变量声明var,没有
    分析函数声明,AO.b=function(){alert(b);},执行覆盖操作
    词法分析
    词法分析主要分为3步:
    第1步:分析形参
    第2步:分析变量声明
    第3步:分析函数声明
    如果存在函数嵌套,则从外往内进行词法分析
    
    具体步骤:
    在函数执行的一瞬间,产生一个空的 Active Object(活动对象),下面简称AO
    AO对象初始化
    2.1 函数声明的形参,形成AO的属性,默认值是undefined,
    2.2 接收实参,给刚刚形成AO的属性的形参赋值
    var声明、函数声明均被提升到函数体顶部(若var声明、函数声明同名,则函数声明将覆盖变量声明),注意,var声明只提前了声明部分,而函数声明提前了整个函数定义。
    分析var声明变量!如 var age;(变量的值是在运行时期决定)
    4.1 如果AO上没有age属性,则给AO添加age属性,默认值是undefined
    4.2 如果AO上有age属性,则不做任何操作。
    分析函数声明!如 function foot(){}
    5.1 如果AO上没有foot属性,则把函数赋给AO.foot属性
    5.2 如果AO上有foot属性,则会直接覆盖,把函数赋给AO.foot属性(因为:若var声明、函数声明同名,则函数声明将覆盖变量声明)
    依据此时AO的值,自上而下执行代码 

    7.this作用域

    var  length = 10;
    var obj1 = {
        length:6,
        method:function(){
           console.log(this.length);
        }
    }
     
    var obj2 = {
        length:3,
        method:function(fn){
            fn();
            arguments[0]();
        }
    }
    obj2.method(obj1.method,obj2.method);
    //输出是:10 2
    //第一个因为在obj2的method中直接执行函数,没有指定作用域的函数,不论在哪里执行,其this永远指向window;
    //第二个因为调用arguments,函数的this指向了arguments对象,arguments对象的长度是2
    var arr = [obj1.method,obj2.method];
    arr[0]();
    //输出的是2,是该数组的长度,因为这个函数的命名空间被限定在了array中,因此this指向的是array

  • 相关阅读:
    caffe源码整个训练过程
    设计模式--工厂模式 caffe_layer注册
    【Oracle】跟踪文件目录(User_Dump_Dest)生成脚本(11g/9i).txt
    【Oracle】修改参数的同时添加注释
    【Oracle】重置参数
    【Oracle】SCOPE=MEMORY|SPFILE|BOTH
    【Oracle】解锁用户
    【Oracle】开、关、删归档日志(archivelog)
    【Oracle】Rman简介
    【Oracle】非RMAN恢复数据文件、控制文件
  • 原文地址:https://www.cnblogs.com/lixuemin/p/5630977.html
Copyright © 2020-2023  润新知