javascript – 这个声明是做什么的? console.log.bind(控制台)

我正在使用JavaScript并获得语句的问题

console.log.bind(console)

请告诉我这个说法是做什么的。我已经应用了这几次,但没有做任何事情。

在JavaScript中,函数调用中的函数由函数调用决定(对于正常函数,请参见*)。如果它被称为检索对象属性的表达式的一部分(例如,foo.bar()作为从foo获取属性检索操作的一部分)调用bar(),则将其设置为属性来自的对象调用函数。

假设你想要一个较短的形式的console.log,如f。你可以这样做:

var f = console.log; // <== Suspect!

…但是如果日志功能依赖于在调用期间引用控制台对象,那么调用f(“Message here”)将不起作用,因为这不会引用控制台。

函数#绑定只适用于这种情况:它允许您创建一个新的函数,当被调用时,将使用此集合将原始值调用为您给出的值。所以

var f = console.log.bind(console); // Still suspect, for a different reason

在理论上应该给你一个函数,f,你可以调用登录到控制台。

除了主机提供的功能,如console.log(和alert和getElementById)不需要是“真正的”JavaScript函数(尽管在现代浏览器中,它们往往是或至少非常接近),并且不需要具有所有的功能,包含绑定。因此,如果您在该行遇到错误,可能是您使用该行的引擎不支持在console.log函数上绑定。

那么什么是“主机提供的功能”?在规范中没有明确定义为JavaScript语言的一部分功能。所以再一次,浏览器是与浏览器相关的功能,如alert或console.log等等。

我可以想到线路可能给你带来麻烦的两个原因:

>以上:您使用的JavaScript引擎不会使console.log成为一个真正的功能。
>您在IE上使用上述行,并关闭开发工具。在IE上,当开发工具未打开时,控制台对象未定义,因此该行将抛出一个ReferenceError。

如果最终目标是要获得一个函数,可以在console.log中为f(“Message here”)调用,那么你可以如何处理上面的#1和#2。

function f(item) {
    if (typeof console != "undefined" && console.log) {
        console.log(item);
    }
}

这只允许你给一个项目,而console.log允许你给多个项目(console.log(“this”,“that”,“和另一个”)),但是如果console.log可能不是一个真正的JavaScript函数,那么它可能没有Function#apply,这使得它很难包装。

现在,如果你不关心得到相同的输出,你可以从console.log(“this”,“that”,“and other”)得到相同的输出,只要你能看到什么,只需使用console.log (参数); (arguments是传入函数的所有参数的内置标识符)。但是,如果要复制确切的输出,最终你会这样做:

function f() {
    var a = arguments;

    if (typeof console != "undefined" && console.log) {
        if (console.log.apply) {
            // It has Function#apply, use it
            console.log.apply(console, arguments);
        } else {
            // Ugh, no Function#apply
            switch (a.length) {
                case 0: console.log(); break;
                case 1: console.log(a[0]); break;
                case 2: console.log(a[0], a[1]); break;
                case 3: console.log(a[0], a[1], a[2]); break;
                case 4: console.log(a[0], a[1], a[2], a[3]); break;
                case 5: console.log(a[0], a[1], a[2], a[3], a[4]); break;
                default:
                    throw "f() only supports up to 5 arguments";
            }
        }
    }
}

…那只是丑陋的

* ES5添加了绑定函数,它们是通过绑定将它们的值附加到它们的函数:

// Normal function
function foo() {
    console.log(this.name);
}

// Create a bound function:
var f = foo.bind(someObject);

如何调用f并不重要,它将调用foo,并将其设置为someObject。

* ES2015(又名ES6)增加了箭头功能。使用箭头函数,这不是通过调用函数来设置的;相反,该函数从创建它的上下文继承这个:

// Whatever `this` is here...
var f = () => {                             // <== Creates an arrow function
    // Is what `this` will be here
};

当您在对象方法中执行像Array#forEach这样的操作时,箭头函数非常方便:

this.counter = 0;
this.someArray.forEach(entry => {
    if (entry.has(/* some relevant something */)) {
        ++this.counter;
    }
});
http://stackoverflow.com/questions/28668759/what-does-this-statement-do-console-log-bindconsole

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:javascript – 这个声明是做什么的? console.log.bind(控制台)