加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > C语言 > 正文

JS疑问

发布时间:2020-12-15 00:15:47 所属栏目:C语言 来源:网络整理
导读:疑问一:变量声明提升 代码片段一 代码片段二 在IIF函数(立即执行函数)的执行上下文中,由于变量声明的提升,沿着作用域链开始逐级向上回溯搜素时,在IIF函数内找到了a变量,上述代码相当于: 参考资料: 疑问二:函数声明和函数表达式 代码片段一 // foo(

疑问一:变量声明提升

代码片段一

代码片段二

在IIF函数(立即执行函数)的执行上下文中,由于变量声明的提升,沿着作用域链开始逐级向上回溯搜素时,在IIF函数内找到了a变量,上述代码相当于:

参考资料:

疑问二:函数声明和函数表达式

代码片段一

// foo(); // 1
// 函数声明
function foo() {
console.log("2");
}
// foo(); // 1

由于函数声明提升总是优先于变量声明提升,因此即使将上述函数表达式和函数声明对调,输出的结果仍不变。上述代码相当于:

foo = function() {  // 覆盖了函数声明
console.log("1");
};

// foo(); // 1
// foo(); // 1

注意:在代码开始执行之前,解析器就已经通过一个名为函数声明提升(function declaration hoisting)的过程,读取并将函数声明添加到执行环境中。而对于函数表达式,代码只会在函数所在语句之后,才能执行。

疑问三:带标识符的函数表达式

在segmentfault看到的一个问题,从这个问题又了解到了“词法记录器”:
代码片段一:

解读:这段代码关乎声明提升(Hoisting),c函数内部的变量没有使用var声明,所以本来b和c为function c() {},被分别覆盖为2和3了。

在代码片段一的基础上修改为以下:
代码片段二:

众所周知,JS的变量和函数声明都会被存储到执行上下文的变量对象(或活动对象)中,即声明提前。

解读:
在JS中函数有两种定义方式:


1. 函数声明:
其中函数声明只有一种形式: 
function 标识符(形参) {函数代码} 
  1. 函数表达式

    而函数表达式有两种形式:
    function 标识符(形参) {函数代码}
    function (形参) {函数代码}

对于函数表达式的第一种写法,var bar = function foo() {};这个标识符标量只在函数的作用域内有效,并且不会被覆盖,在函数外围无效(在IE8及IE8以下浏览器却是可见的)。所以代码片段三,C输出为function c() {};而不是3

在代码片段二的基础上修改为以下:
代码片段三:

相关资料:

疑问四:js高级程序(闭包与变量)代码

闭包是指:当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的其它变量,如果返回的这个函数在外部被执行,就产生了闭包。——摘自

  • javascript高级程序设计(第三版) 7.2.1闭包与变量

原书上的代码似乎要改成这样,result数组里才会存放每一个i的值。如若像书本那样写,result的值将会是:

经过修改后的代码的result的值:

拓展:

疑问五:事件委托机制

随着内存中的对象越多,性能越差,而且,添加到页面上的事件处理程序数量会直接关系到页面的整体性能。随后,便出现了事件委托机制。使用事件委托技术能让你避免对特定的每个节点添加事件监听器;相反,事件监听器是被添加到它们的父元素上。事件监听器会分析从子元素冒泡上来的事件,找到是哪个子元素的事件。

代码示例:

列表1
 
  • 列表2
  • 列表3
  • 疑问六:call函数

    Chrome36控制台下执行下列代码,为何输出this的时候,不是基本类型值String?

    疑问七:Array.prototype.slice.call/apply()

    更多时候,该方法一般运用到array-like类数组上,因为这种数据没有数组所特有的属性和方法。类似:函数内部的arguments对象,它类似于数组,没有数组所特有的属性和方法,除了length。

    注意:在MDN中,……不应在 arguments 对象上使用 slice 方法,这会阻碍 JavaScript 引擎的优化 (比如 V8 引擎)。作为替代,应通过遍历arguments对象的方式来构建一个新的数组。

    相关资料:



    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读