【发布时间】:2010-12-24 09:03:56
【问题描述】:
JavaScript 代码 sn-ps 是否在某种函数声明下方给出?如果不能,请概述一下它们是什么?
some_func = function(value) {
// some code here
}
和
show:function(value){
// some code here
}
【问题讨论】:
标签: javascript function-declaration
JavaScript 代码 sn-ps 是否在某种函数声明下方给出?如果不能,请概述一下它们是什么?
some_func = function(value) {
// some code here
}
和
show:function(value){
// some code here
}
【问题讨论】:
标签: javascript function-declaration
一种方法:
var some_func = function(value) {
// some code here
}
另一种方式:
function some_funct() {
}
另一种方式:
var some_object={};
some_object["some_func"] = function() {};
或:
var some_object={};
some_object.some_func = function() {};
换句话说,它们是在 JS 中声明函数的多种方式。
你的第二个例子不正确。
【讨论】:
some_object["some_func"] = function() {}; 很麻烦。使用点符号更简洁:some_object.some_func = function() {};
第一个是分配给变量的函数声明(至少应该是,尽管它首先缺少变量类型声明),第二个可能与对象声明有关。
【讨论】:
some_obj = { init: function() {}, show: function() {} };
它们被称为匿名函数;你可以在这里阅读更多关于它们的信息:
http://www.ejball.com/EdAtWork/2005/03/28/JavaScriptAnonymousFunctions.aspx
【讨论】:
首先是具有指定匿名函数的局部(或全局)变量。
var some_name = function(val) {};
some_name(42);
Second 是具有指定匿名函数的某个对象(或前面带有标签的函数)的属性。
var obj = {
show: function(val) {},
// ...
};
obj.show(42);
函数是 JavaScript 中的一等公民,因此您可以将它们分配给变量并从变量中调用这些函数。
您甚至可以用其他名称声明函数,而不是该函数将分配给的变量。当您想要定义递归方法时,它很方便,例如,而不是这个:
var obj = {
show: function(val) {
if (val > 0) { this.show(val-1); }
print(val);
}
};
你可以写:
var obj = {
show: function f(val) {
if (val > 0) { f(val-1); }
print(val);
}
};
【讨论】:
第一个是简单地创建一个匿名函数并将其分配给变量some_func。所以使用some_func()会调用函数。
第二个应该是对象符号的一部分
var obj = {
show:function(value){
// some code here
}
};
所以,obj.show() 会调用函数
在这两种情况下,您都在创建一个匿名函数。但在第一种情况下,您只是将其分配给一个变量。而在第二种情况下,您将其分配为对象的成员(可能在许多其他对象中)。
【讨论】:
obj 的外括号是多余的
eval("({a:1})") 之类的对象时才会这样做
(function() {})()是一个自调用函数表达式; function(){} 周围的括号是将其转换为函数表达式所必需的。否则它被视为一个函数声明,缺少标识符(或者,如果提供了标识符,则以下())将是语法错误。
第一个示例创建一个名为 some_func 的全局变量(如果该名称的局部变量不存在),并为其分配一个函数,以便可以调用 some_func()。
第二个例子是对象内部的函数声明。它分配一个函数作为对象的show 属性的值:
var myObj = {
propString: "abc",
propFunction: function() { alert('test'); }
};
myObj.propFunction();
【讨论】:
第一个...
some_func = function(value) {
// some code here
}
正在声明一个变量,并为其分配了anonymous function,相当于...
function some_func (value) {
// some code here
}
第二个应该是这样的......
obj = {
show:function(value){
// some code here
}
}
// obj.show(value)
相当于...
//pseudo code
class MyClass {
function show (value) {
// some code here
}
}
obj = new MyClass(); // obj.show(value)
干杯
【讨论】:
var Obj = function() { this.show = function() {}; } 相当于你的伪代码。
obj={show:function(value){alert("work");}} obj.show();
obj.show()不行,我说你的例子不等价。
创建函数有六种方式/上下文:
1) 标准的声明式表示法(有 C 背景的人最熟悉)
function foo() {}
其余的都是函数表达式:
2) 作为对象字面量的方法
var obj = {
foo: function() {}
};
3) 作为实例化对象的方法(每次执行new 时创建)
var Obj = function() {
this.foo = function() {};
};
4) 作为原型的方法(只创建一次,不管new被执行多少次)
var Obj = function() {};
Obj.prototype.foo = function() {};
5) 作为带有引用的匿名函数(与#1 效果相同)*
var foo = function() {};
6) 作为立即执行的匿名函数(完全匿名)
(function() {})();
* 当我看这个陈述时,我会考虑结果。因此,我并不认为这些是匿名的,因为会立即创建对该函数的引用,因此不再是匿名的。但对大多数人来说都是一样的。
【讨论】: