zoukankan      html  css  js  c++  java
  • 蛮考验基础的JS笔试题(有坑小心!)

    1.  考察this

     1 var length = 10
     2 function fn(){
     3     alert(this.length)
     4 }
     5 var obj = {
     6     length: 5,
     7     method: function(fn) {
     8         fn() // ?
     9         arguments[0]() // ?
    10     }
    11 }
    12 obj.method(fn)

    这里的坑主要是arguments,我们知道取对象属于除了点操作符还可以用中括号,这里fn的scope是arguments,即fn内的this===arguments,调用时仅传了一个参数fn,因此length为1。

     

    2. 函数表达式具名(函数声明同时赋值给另一个变量)或函数声明立即执行时,名仅在该函数内可访问

    1 ~function() {
    2     alert(typeof next) // ?
    3     ~function next() {
    4         alert(typeof next) // ?
    5     }()
    6 }()

    外层匿名函数自执行,打印next,接着内层具名函数自执行。会发现具名的next仅在其自身函数体内可访问,即输出为function。外面是不可见的,typeof就为undefined了。(注:此题IE6/7/8中输出为function function, 标准浏览器为undefined function

    同样的情况也发生在将具名函数赋值给一个变量时,如下:

    1 var func = function a() {
    2     alert(typeof a)
    3 }
    4 func() // ?
    5 alert(typeof a) // ?

    这条规则是标准中(ES3/ES5)都已明确指出,但IE6、7、8没有严格遵从。可参见w3help的分析或李松峰老师的翻译《命名函数表达式探秘

     

    3. 给基本类型数据添加属性,不报错,但取值时是undefined

    1 a = 3
    2 a.prop = 4
    3 alert(a + a.prop) // ?

    变量a为数字3,给其添加prop属性,值为4(奇怪吧在JS中这是允许的,且不会有语法错误)。然后alert出a+a.prop的结果。结果是NaN。a.prop为undefined,3+undefined为NAN。

    举一反三,给字符串添加属性:

    1 str = 'a'
    2 str.prop = 'b'
    3 alert(str + str.prop) // ?

    结果呢?

     

    4. 隐式的全局变量

    1 var a = 1
    2 function func() {
    3     a = b = 2
    4 }
    5 func()
    6 alert(a)
    7 alert(b) // ?

     JS中不用var声明的变量默认是全局变量,而这里的连等使的情况更加隐蔽。这里的b是全局的,因此func外可以访问。

     

    5. 变量声明早于代码运行(Scoping and Hoisting

    1 var uname = 'jack'
    2 function change() {
    3     alert(uname) // ?
    4     var uname = 'lily'
    5     alert(uname)
    6 }
    7 change()

    这里容易犯迷糊的是第一个alert,如果认为函数change外已经声明赋值了,此时应该是jack,实际函数内又var了一次(虽然var在其后),预解析时仍然会将其置undefined。这也是为什么书里都建议变量声明都放在代码块的最前面。

     

    6. 函数声明早于变量声明

    1 function change() {
    2     alert(typeof fn) // ?
    3     function fn() {
    4         alert('hello')
    5     }
    6     var fn
    7 }
    8 change()

    change内先alert出fn,后函数声明,再变量声明。如果fn没有函数声明而仅是变量声明,那么结果与5一样是undefined。但这里却是function。即同一个作用域内,函数声明放在代码块后面和前面都没有关系,函数可以正常使用。而变量声明则需先置前,先使用则是undefined。

  • 相关阅读:
    springmvc
    POJ 3683 Priest John's Busiest Day
    POJ 3678 Katu Puzzle
    HDU 1815 Building roads
    CDOJ UESTC 1220 The Battle of Guandu
    HDU 3715 Go Deeper
    HDU 3622 Bomb Game
    POJ 3207 Ikki's Story IV
    POJ 3648 Wedding
    HDU 1814 Peaceful Commission
  • 原文地址:https://www.cnblogs.com/ttcc/p/3922692.html
Copyright © 2011-2022 走看看