javascript - 未定义的 NodeJS 'toUpperCase'(从 typescript 生成)

标签 javascript node.js typescript

为什么这在我从 nodejs 启动时有效:

var a = function (name) {
        return "Hello, " + name.toUpperCase();
    };
var result = a("bob");

console.log(result)

但是这个:

var A = (function () {
    function A(msg) {
        this.msg = " ";
        this.msg = msg;
    }
    A.prototype.hello = function (name) {
        return "Hello, " + name.toUpperCase();
    };
    A.prototype.helloToBob = function (fn) {
        return fn.apply("Bob");
    };
    return A;
})();
var test = new A("some message");
var msg = test.hello("Bob1");
var msg2 = test.helloToBob(test.hello);
console.log(msg);

失败:

    return "Hello, " + name.toUpperCase();
                            ^ TypeError: Cannot call method 'toUpperCase' of undefined

?

从 TypeScript 代码生成/编译的 JS 代码。(编译无错误)

最佳答案

问题出在这行代码中。

 return fn.apply("Bob");

这里有几个问题。

  1. .apply(obj, arrayOfArguments) 的第一个参数需要是您希望在方法调用期间将 this 指针设置为的对象。

  2. .apply() 的第二个参数是参数数组,而不是单个参数。

这是一个可能的解决方案,您使用 this 作为对象并切换到 fn.call() 因为 fn.apply() 需要一组参数,但你只有一个参数。

改变这个:

 return fn.apply("Bob");

为此:

return fn.call(this, "Bob");

并且,所有代码放在一起:

var A = (function () {
    function A(msg) {
        this.msg = " ";
        this.msg = msg;
    }
    A.prototype.hello = function (name) {
        return "Hello, " + name.toUpperCase();
    };
    A.prototype.helloToBob = function (fn) {
        return fn.call(this, "Bob");
    };
    return A;
})();
var test = new A("some message");
var msg = test.hello("Bob1");
var msg2 = test.helloToBob(test.hello);
console.log(msg);

仅供引用,还有其他解决方案。你也可以这样做:

var A = (function () {
    function A(msg) {
        this.msg = " ";
        this.msg = msg;
    }
    A.prototype.hello = function (name) {
        return "Hello, " + name.toUpperCase();
    };
    A.prototype.helloToBob = function (fn) {
        return fn("Bob");
    };
    return A;
})();
var test = new A("some message");
var msg = test.hello("Bob1");
var msg2 = test.helloToBob(test.hello.bind(test));
console.log(msg);

关于javascript - 未定义的 NodeJS 'toUpperCase'(从 typescript 生成),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28378839/

相关文章:

javascript - 在客户端和服务器端格式之间转换数据的正确术语是什么?

javascript - 如何在 typeahead Angular 4 中使用 limitTo?

typescript - 通过返回类型的调用签名联合缩小函数类型

javascript - 将多个选项传递给 JavaScript 中的函数

javascript - 如何判断某个元素是否正在使用 jQuery 进行拖动?

javascript - 对象未定义但 console.log 显示一个对象

javascript - 让 return 语句等待,直到函数中的其他所有内容都完成

javascript - JavaScript 拓扑库

javascript - references.d.ts 文件的作用是什么?它在 NativeScript 项目中的位置?

javascript - Angular 插值滞后于渲染某些值以及如何从 typescript 对象数组中删除一项