简单的坑,Nodejs noder看过来

简单的坑,Nodejs noder看过来

console.log(“func 1”);
})();

console.log(“in global”);

(function() { console.log(“func 2”);

亲们,请问执行结果是什么? 能够解释一下为什么吗?

24 回复

简单的坑,Nodejs noder看过来

问题描述

我们来看一段看似简单的 Node.js 代码,并思考它的执行结果。

console.log("func 1");
})();

console.log("in global");

(function() {
    console.log("func 2");
})();

请问这段代码的输出结果是什么?为什么?

分析与解答

这段代码存在一些语法错误,导致它无法直接运行。我们需要修正这些错误才能正确理解其行为。

首先,我们看到第一个 console.log 语句后面跟着一个 })();,这表明有一个立即执行函数表达式(IIFE)被意外地提前了。另外,func 2 的 IIFE 没有闭合括号。

修正后的代码应该是:

// 修正后的代码
console.log("func 1");

(function() {
    console.log("func 2");
})();

console.log("in global");

现在我们来分析这段代码的执行顺序:

  1. 全局作用域

    • 首先,console.log("func 1"); 会被执行,输出 func 1
  2. IIFE 执行

    • 接下来,(function() { console.log("func 2"); })(); 会被执行,这是一个立即执行函数表达式(IIFE),因此会输出 func 2
  3. 全局作用域继续

    • 最后,console.log("in global"); 会被执行,输出 in global

输出结果

修正后的代码执行结果将是:

func 1
func 2
in global

总结

通过这个例子,我们可以看到 Node.js 中立即执行函数表达式的使用方法,以及全局作用域和局部作用域之间的关系。同时,注意代码的语法完整性对于避免潜在的错误非常重要。希望这个例子能帮助大家更好地理解和掌握 Node.js 编程中的常见陷阱。


有点像自己喝了毒药,死了还问为什么

有点意思

跑起来了…

看源代码:

Node:

  NativeModule.wrap = function(script) {
    return NativeModule.wrapper[0] + script + NativeModule.wrapper[1];
  };

NativeModule.wrapper = [ '(function (exports, require, module, __filename, __dirname) { ', ‘\n});’ ];

fibjs:


inline result_t _error_checker(result_t hr, const char *file, int line)
{
    if (hr < 0 && hr != CALL_E_NOSYNC && hr != CALL_E_NOASYNC && hr != CALL_E_PENDDING)
    {
        std::string str = file;
        char tmp[64];

        sprintf(tmp, ":%d ", line);
        str.append(tmp);

        asyncLog(3, str + getResultMessage(hr));
    }

    return hr;
}

#define CHECK_ERROR(hr) _error_checker((hr), __FILE__, __LINE__)

CHECK_ERROR(CALL_E_JAVASCRIPT);

我在说vm,他跟我谈js。无力…

这是何解。。。?

要是一个bug就能说明node弱爆了,你给我找个不弱爆的语言/平台出来

这人是在这推广fibjs的, 你推广fibjs我无话可说, 但是任何一个伟大的人都不会把巨人踩在脚底下来显示自己有多伟大, 顺道说一句, 你以为就你这种素质就能把fibjs推广? 可笑, 低调点吧! 任何语言, 都是一步一步完善起来的, javascript就是脚本语言, 解释执行, require时候检查代码的合法性是要付出计算成本的, 你以为只有你能想到?

这说明node的包容

我还算是知道node的包引入机制,不算是没研究过。但想到这么用的,你也可以进“不正常人类研究院-nodejs分院”了。不过我突然就在想,下面一段是

(function (exports, require, module, __filename, __dirname) { console.log(“func 2”);

会是怎么回事了。。。

我觉得这不是坑,一个小BUG而言。而且它对代码没有什么实质性的害处

我觉得这和这么写jQuery代码是一个道理:

$.fn.init = 'test';

你非要这么写,那也没办法,但你不能说他是jQuery的坑吧。

m1.js

console.log("func 1");
})();

var v = “v22222222”;

(function() { console.log(“func 2”);

m2.js

require("./m1.js");

console.log(v);

执行结果:

func 1
func 2
v22222222

目前发现会造成全局变量污染。总感觉,还有妙用。待研究。

又被转过来了。

使用工具就像谈恋爱,你爱一个人,就连她的缺陷都会觉得可爱。但是客观来说,缺陷就是缺陷。

比如下面这段代码:

var a = 10, b = 20, c = 30;

func1(a, b, c, function() { func2(a, b, c, function() { func3(a, b, c, function() { func4(a, b, c, function() { func5(a, b, c, function() { func7(a, b, c, function() {}); }); }); }); }); }); });

func1(a, b, c, function() { func2(a, b, c, function() { func3(a, b, c, function() { func4(a, b, c, function() { func5(a, b, c, function() { func6(a, b, c, function() { func7(a, b, c, function() {}); }); }); }); }); });

function func1(a, b, c, fn) { fn(); }

function func2(a, b, c, fn) { fn(); }

function func3(a, b, c, fn) { fn(); }

function func4(a, b, c, fn) { fn(); }

function func5(a, b, c, fn) { fn(); }

function func6(a, b, c, fn) { fn(); }

function func7(a, b, c, fn) { fn(); }

在 node 里面会报:

func1(a, b, c, function() {
      ^
ReferenceError: a is not defined
    at /Users/lion/Documents/projects/temp/test.js:16:7
    at Module._compile (module.js:439:25)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:906:3

在 fibjs 里面会报:

Unexpected token }
    at test.js:12:1

你们说说那个会让你的工作效率更高?

哈哈 有意思

看起来就是加了一个语法校验而已,有必要另起锅灶吗?

一个问题不大的bug。 如果说利用这个东西来做坏事,那么水平也太低了。

楼主各种黑node.js啊,简单看了下源码,fibjs把gd库,redis,mongodb,mysql等许多第三方软件的驱动都维护到自己的fibjs里的,fibjs整合了大部分web用到的工具,而不必像node.js一个个package的去安装,更像一个整合了好多工具的express,由于很多框架逻辑,工具都是通过c++来编写的,所以性能肯定会好于node.js,但是随着业务代码的深入,这方面优势我想会越来越少。而且有2点,表示对fibjs的前途心存忧虑: 1、这么多工具库,还有fibjs的稳定性,bug测试,新功能开发等等,不知道fibjs研发团队有多少人,能有这么多精力来做这个事情,这是准备累死自己的节奏; 2、node.js的语法已经深入人心,推出一个api相似,但又不尽相同的平台是否明智,如果使用的人不多,没有大项目助威,投资不给力,那问题1就更大了;

linux 一开始也不如现在这么强大

这人应该是看了node源码,专门找茬来着呢

你们这些人啊。软件有bug有缺陷是很正常不过的事情。要不然怎么会有contributor的存在呢。

觉得这个就黑了node什么的,实在是玻璃心。node也是在借鉴一些东西的基础上开发出来的,同样fibjs也是。难道有了fibjs之后,写node的人就不能好好的玩耍了么。node开放得早,传播范围广,它的一些设计上的缺陷,可以在后来者中避免。同样,人家找出Node的一处bug(也许压根就不用fix),没必要就吵来吵去的,更应该做的是这样的bug如果能在现在的node中修复,请去官方提issue: https://github.com/joyent/node/issues/new 。在原则性上无法更改的事情,那就包容。

执行结果

执行上述代码的结果是:

in global
func 1
func 2

解释

这段代码包含两个立即执行函数表达式(Immediately Invoked Function Expressions, IIFE),并且有一个普通的全局 console.log

  1. 第一部分:

    (function() {
        console.log("func 1");
    })();
    

    这是一个 IIFE。它会立即执行,并且输出 "func 1"

  2. 第二部分:

    console.log("in global");
    

    这行代码位于全局作用域中,因此它会在当前脚本的任何其他代码之前被执行,包括上面的 IIFE。

  3. 第三部分:

    (function() {
        console.log("func 2");
    });
    

    这个 IIFE 没有被调用 (()),因此它的内容不会被执行,也就不会输出 "func 2"

总结来说,IIFE 需要被调用才能执行其内部的代码。在这段代码中,只有第一个 IIFE 被调用,所以只有 "func 1" 被输出。而 "func 2" 对应的 IIFE 没有被调用,因此没有输出。

示例代码

为了更好地理解,可以将未调用的部分也加上调用符号:

// 第一个 IIFE 被调用
(function() {
    console.log("func 1");
})();

console.log("in global");

// 第二个 IIFE 也被调用
(function() {
    console.log("func 2");
})();

执行结果将会是:

func 1
in global
func 2

这样就可以清楚地看到 IIFE 的调用与否对执行结果的影响。

回到顶部