Nodejs 函数 A 在函数 B 中执行的几种方式中实际上有那些区别呢?详情如下:

发布于 1周前 作者 songsunli 来自 nodejs/Nestjs

Nodejs 函数 A 在函数 B 中执行的几种方式中实际上有那些区别呢?详情如下:

//方式一:
function B(callback) {

 if(typeof callback === "function") {
         callback() ;
 }

}

//方式二: function B(callback) {

 if(typeof callback === "function") {
       callback.apply(null,arguments) ;
 }

}

//方式三: function B(callback) {

 if(typeof callback === "function") {
       callback.call(null,arguments[0],arguments[1]) ;
 }

}

谢谢大家!


6 回复

好像跟 this 有关。


装饰器, 2 和 3 的区别就是:
apply 参数是 array ; call 参数按顺序传入

看解释器吧,除了堆栈还有栈的建立退出之外,想不到能有什么区别了

就如何传递参数方面,主要还是看应用场景。

看次问题重点还是要关注函数内 this 指向。

callback() 这样在 callback 内的 this 就是全局对象。

callback.call(null) 或者 callback.apply(null) 如果是非严格模式, this 也是全局对象,如果是严格模式的话, this 就是 null 了。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

楼上说的对。
另外 1 没有参数
2 可以有任意多个参数
3 只能是两个参数

在Node.js中,函数A在函数B中执行的方式主要可以分为以下几种,每种方式都有其特定的用途和区别:

  1. 同步调用: 这是最直接的方式,函数A在函数B中被直接调用,并且会阻塞后续代码的执行,直到函数A执行完毕。

    function B() {
        function A() {
            console.log("A is executed synchronously");
        }
        A();
    }
    B();
    
  2. 异步回调: 函数A作为回调函数传递给函数B,函数B在适当的时机(如异步操作完成后)调用函数A。这种方式不会阻塞后续代码的执行。

    function B(callback) {
        setTimeout(() => {
            callback();
        }, 1000);
    }
    function A() {
        console.log("A is executed asynchronously as a callback");
    }
    B(A);
    
  3. Promise: 函数B返回一个Promise对象,函数A作为Promise的then回调执行。这种方式可以更好地处理异步操作,并支持链式调用和错误处理。

    function B() {
        return new Promise((resolve) => {
            setTimeout(() => {
                resolve();
            }, 1000);
        });
    }
    function A() {
        console.log("A is executed using Promise");
    }
    B().then(A);
    
  4. async/await: 函数B使用async声明,函数A在await B()后执行。这种方式使得异步代码看起来更像是同步代码,易于理解和维护。

    async function B() {
        return new Promise((resolve) => {
            setTimeout(() => {
                resolve();
            }, 1000);
        });
    }
    async function run() {
        await B();
        A();
    }
    function A() {
        console.log("A is executed after await B()");
    }
    run();
    

这几种方式各有优劣,选择合适的方式取决于具体的应用场景和需求。

回到顶部