zoukankan      html  css  js  c++  java
  • 这五个题你懂了javascript你就入门了

    1、

    1 if (!("a" in window)) {
    2     var a = 1;
    3 }
    4 alert(a);

    阅读代码:如果window不包含属性a,就声明一个变量a,然后赋值为1,最后弹出这个变量的值。

    理解代码:javascript没有块级作用域,所以var a=1;定义的a是全局的,又因为全局的变量都是window的属性(注意没有用var声明的变量也是全局的也是window的属性但是不能被delete);所以执行过程是进不了if内部的,又因为变量什么的提升,其实在执行if(判断语句)的时候,a其实已经存在于执行上下文的变量对象中了,上面的代码相当于:

    1 var a;
    2 if (!("a" in window)) {
    3     a = 1;
    4 }
    5 alert(a);

    再次拟请代码:首先声明a,然后判断a是否在存在(是不是window的属性),如果不存在就赋值为1,很明显a永远在window里存在,这个赋值语句永远不会执行,所以结果是undefined。

    1 var a = undefined;
    2 if (!("a" in window)) {
    3     a = 1;
    4 }
    5 alert(a);

    2、

    1 var a = 1,
    2     b = function a(x) {
    3         x && a(--x);
    4     };
    5 alert(a);

    阅读代码:首先定义变量a并赋值为1;然后定义一个函数表达式赋值给b;但是这个函数表达式是个有名函数表达式,在这里不同的浏览器会有不同的解析:在IE里,会将a认为函数声明,所以它被变量初始化覆盖了(后续谈一下变量覆盖问题),就是说如果调用a(--x)的话就会出错(因为a是一个变量),而其它浏览器在允许在函数内部调用a(--x),因为这时候a在函数外面依然是数字,在函数内就是本身的函数声明。上面的代码其实可以完全不看b这个函数表达式,所以以上代码执行的结果为alert出1。

    1 var a = 1,
    2     b = function(x) {
    3         x && b(--x);
    4     };
    5 alert(a);

    变量覆盖问题:函数声明会覆盖变量声明,但不会覆盖变量赋值(函数声明的优先级高于变量声明的优先级,但如果该变量value赋值了)

    1 function value(){
    2     return 1;
    3 }
    4 var value;
    5 alert(typeof value);    //"function"
    1 function value(){
    2     return 1;
    3 }
    4 var value = 1;
    5 alert(typeof value);    //"number"

    3、

    1 function a(x) {
    2     return x * 2;
    3 }
    4 var a;
    5 alert(a);

    //就是第二题的函数声明覆盖变量声明

    4、

    1 function b(x, y, a) {
    2     arguments[2] = 10;
    3     alert(a);//10;
    4 }
    5 b(1, 2, 3);

    首先理解Arguments对象,他有一下三个属性:

    1. callee — 指向当前函数的引用
    2. length — 真正传递的参数个数
    3. properties-indexes (字符串类型的整数) 属性的值就是函数的参数值(按参数列表从左到右排列)。 properties-indexes内部元素的个数等于arguments.length. properties-indexes 的值和实际传递进来的参数之间是共享

    当传入函数的参数小于argument的索引值时,比如你只传入2个参数,而还继续使用arguments[2]赋值的话,就会不一致,

    1 function b(x, y, a) {
    2     arguments[2] = 10;
    3     alert(a);//undefined;
    4   alert(arguments[2]);//10;
    5 } 6 b(1, 2);

    5、

    1 function a() {
    2     alert(this);
    3 }
    4 a.call(null);

    这道题有几个点:this、call、null;

    this--谁调用就指向谁;

    call--第一个参数改变this指向;

    null--指代的是window。

    注意这里的null:根据ECMAScript262规范规定:如果第一个参数传入的对象调用者是null或者undefined的话,call方法将把全局对象(也就是window)作为this的值。所以,不管你什么时候传入null,其this都是全局对象window;

    1 function a() {
    2     alert(this);//window;
    3 }
    4 a.call(window);
  • 相关阅读:
    模板汇总 —— 杨式图表
    HDU 6634 网络流最小割模型 启发式合并
    网络流 从0开始学建图
    分层图 单调决策性DP
    模板汇总——笛卡尔树
    Bzoj 2127 happiness 最小割
    manacher --- 暂 旧版本
    Bzoj 3730 震波 动态点分治
    HDU
    Maven私服(Repository Manager)
  • 原文地址:https://www.cnblogs.com/cdwp8/p/4067982.html
Copyright © 2011-2022 走看看