Javascript 一个函数和一个对象同时存在?

Javascript 一个函数和一个对象同时存在?,javascript,Javascript,在创建一个函数变量之后,您是否可以将其属性指定给它,就好像它是一个常规对象一样?这就是我所做的: var example = function(a, b){ console.log(a, b); } example.someProperty = 'hi there'; 然后我在浏览器控制台中键入以下行: example('Hello', 'world') // Hello world example.someProperty // hi there 所以现在基本上“示例”var同时作

在创建一个函数变量之后,您是否可以将其属性指定给它,就好像它是一个常规对象一样?这就是我所做的:

var example = function(a, b){
    console.log(a, b);
}
example.someProperty = 'hi there';
然后我在浏览器控制台中键入以下行:

example('Hello', 'world') // Hello world
example.someProperty // hi there

所以现在基本上“示例”var同时作为一个函数和一个对象。这给我提出了一些问题,其中一个是为什么,另一个是——有没有办法通过创建对象文字来做到这一点,因为我想不出这种方法。

函数确实是JavaScript中的对象。与任何其他对象一样,它们也有一个原型,这就是
.call()
.apply()
&
.bind()
等方法的来源

所以现在基本上“示例”var同时作为一个函数和一个对象

它不是函数和对象,它是函数和对象。函数是JavaScript中的对象

这给我提出了一些问题,其中之一就是为什么

从根本上说,这就是艾奇在1995年5月的那10天里决定要做的事。为什么他认为只有他才能回答这个问题,但多年来,有许多语言也没有理由将函数视为特殊和不同的东西。他大概是受了这些影响。函数是合适的对象,这是非常方便和灵活的。例如:

function foo() {
    // ...
}
var f = foo;
我可以使用变量
f
来引用
foo
,因为
foo
是一个对象。在许多语言中,如Java,这样做真的很痛苦(尽管由于最近添加了lambdas,Java现在有点好)

因为函数是对象,所以它们有一个原型,这意味着我可以向所有函数添加特性。例如:我发现能够获取函数和“bake-in”(或“”)参数非常方便:

// A simple function
function foo(a, b) {
    console.log("a is " + a);
    console.log("b is " + b);
}

// Create a new one that, when called, will call the original passing in
// 1 as the first argument and then passing in any further arguments,
// preserving the `this` it was called with
var f = foo.curry(1);

// Call it
f(2); // "a is 1" / "b is 2"
由于JavaScript没有
curry
函数(它有
bind
,这与此类似,但会干扰
),因此我可以添加一个:

var slice = Array.prototype.slice;
Object.defineProperty(Function.prototype, "curry", {
    value: function() {
        var f = this;
        var args = slice.call(arguments);
        return function() {
            return f.apply(this, args.concat(slice.call(arguments)));
        };
    }
});
瞧,现在我可以在任何函数上使用
curry

var slice=Array.prototype.slice;
Object.defineProperty(Function.prototype,“curry”{
值:函数(){
var f=这个;
var args=slice.call(参数);
返回函数(){
返回f.apply(这是args.concat(slice.call(arguments));
};
}
});
//简单函数
函数foo(a,b){
log(“a是”+a);
log(“b是”+b);
}
//创建一个新的,当调用时,将调用原始传入
//1作为第一个参数,然后传入任何其他参数,
//保留它被称为的“this”
var f=食用咖喱(1);
//叫它
f(2);//“a是1”/“b是2”


在javascript中,函数是对象。第一类对象您关于对象文字的问题不清楚。在询问之前,您是否尝试过您的代码?就像你们想象的一样,一切正常。谢谢大家。我当然意识到javascript中的函数是对象。我也知道他们有原型,但老实说,我没有弄清楚它们之间的联系。现在这对我来说太明显了,我觉得自己很愚蠢。谢谢你的解释。