FireFox中JS引擎对函数声明式的解析与其他浏览器的差异

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-02 05:22 点击:

 

  在FireFox和FireBug中的一个Bug这篇文章中,偶然发现了FireFox下的函数声明问题,一直没有得到权威的资料来解决。11月26日面试新浪微博的时候,面试官也问到了这个问题,当然他没看我的BLOG,并从他口中得知,这个不是BUG,而是FF的Monkey引擎就是这样解析的,当然我的回答是:“个人推测,在FF下对语句快内的函数声明转化为函数表达式”。 面试官说不是,当然也没给出具体答案,提示我说MDN有这方面的资料。

 

       如果懒得看前面的文章的话,可以看看下面一个简单的例子,在FF/IE/Chrome都跑一遍,看看FF和其他二者之间的差异:(FF会报错,其他的会弹出函数代码)

 

view plain

if(0){ 

    function a(){} 

alert(a); 

       当天晚上,我去找了找MDN,还真被我找到了,从资料上看,和我的推测是一致的,就是例子也和我前面提到的文章也类似。具体链接如下:

 

https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope#Function_constructor_vs._function_declaration_vs._function_expression

 

英文水平不是特别好,这里贴下重点部分和例子,并稍微翻译下(强烈建议看原文,我的翻译太蹩脚了):

 

 

函数声明式非常容易(并且常常出乎意料)转化为函数表达式。一个函数声明要么转化为一个表达式的部分,要么不再是一个函数或脚本本身的"source element"。"source element" 是脚本中或一个函数体内的非嵌套语句。

 

给出的例子如下:

 

var x = 0;               // source element 

if (x == 0) {            // source element 

   x = 10;               // not a source element 

   function boo() {}     // not a source element 

function foo() {         // source element 

   var y = 20;           // source element 

   function bar() {}     // source element 

   while (y == 10) {     // source element 

      function blah() {} // not a source element 

      y++;               // not a source element 

   } 

Examples:

 

 

// function declaration 

function foo() {} 

 

// function expression 

(function bar() {}) 

 

// function expression 

x = function hello() {} 

 

if (x) { 

   // function expression 

   function world() {} 

 

// function declaration 

function a() { 

   // function declaration 

   function b() {} 

   if (0) { 

      // function expression 

      function c() {} 

   } 

 条件定义一个函数

 函数可以用//函数语句//(一个ECMA-262 第3版允许的扩展)或者Function构造函数条件的定义。

 

 在下面的脚本中,zero函数绝不会被定义并且不能够被触发,因为'if (0)'将它的条件判断为false:

 

 

 

if (0) { 

   function zero() { 

      document.writeln("This is zero."); 

   } 

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • Gb2312转utf-8编码的方法(vbs+js)
      • 如何使用Ajax技术开发Web应用程序(1)
      • js跳转路径问题
      • JavaScript模仿桌面窗口
      • 用js检测两个线段是否相交
      • 我知道的JavaScript -- 设计模式(桥接)应用之 – 验证器
      • 运用JavaScript构建你的第一个Metro式应用程序(on Windows
      • 我是如何去了解jquery的(六),案例之幻灯片轮换
      • Jquery封装幻灯片效果
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1