Javascript 第 Class 个函数
Javascript First Class Functions
在阅读有关 Javascript First Class Functions here at SO 时,我遇到了这个 link:
What is meant by 'first class object'?
其中我发现了这个有趣的例子:
var men = function (objectOfAdmiration) {
return objectOfAdmiration();
};
men.isSweetHeart = true;
var women = function (objectOfAdmiration) {
return objectOfAdmiration();
};
women.isSweetHeart = true;
var aliens = function (objectOfAdmiration) {
return objectOfAdmiration();
};
function like(obj){
if (obj.isSweetHeart) {
return function (){ return "Holy TRUE!"};
}
else {
return function (){ return "Holy CRAP!"};
}
}
alert("Men like women is " + men(like(women))); // -> "Holly TRUE!"
alert("Women like men is " + women(like(men))); // -> "Holly TRUE!"
alert("Men like aliens is " + men(like(aliens))); // -> "Holly CRAP!"
alert("Aliens like women is " + aliens(like(women))); // -> "Holly TRUE!"
我需要有人来解释这段代码,这里的执行方式。特别是表达式 men(like(women))
and/or women(like(men))
。这是如何产生最终结果的...
提前致谢
只要记住你的 "order of operations" 高中代数:
- 括号
- 指数
- 乘法
- 师
- 加法
- 减法
括号总是先求值。并且,在表达式具有嵌套括号集的情况下,内部集先于外部集计算。
因此,与:
men(like(women))
like
函数首先使用传递给它的 women
变量的值调用。
无论那个函数 returns 是传递给 men
函数的参数。像这样:
men( result of calling like(women) )
而且,women(like(men))
是同一个思路,只是颠倒了先调用的那个。
所以,让我们一步一个脚印。
- 首先认识到
men
、women
非常重要
和 alien
函数实际上都是相同的。他们只是调用
无论你传递给他们什么,结果 return (在这种情况下
永远是另一个功能)。你可以推断出这一点,因为他们都
做的是在输入参数的末尾加上一组括号。
因此,他们每个人都期望传递一个函数(因为
这是您唯一可以调用的东西)。
因此,让我们少关注这些函数,多关注 like
函数,因为这是 return 与其调用者不同的函数。
阅读内联评论以获取解释:
// Function expression that sets men to hold a function
var men = function (objectOfAdmiration) {
// This function is expecting a function to be passed to it
// because all it does is invoke what is passed and only
// functions can be invoked.
return objectOfAdmiration();
};
// Treat men like an object now and give it an isSweetHeart property with a value of true
men.isSweetHeart = true;
// Function expression that sets women to hold a function
var women = function (objectOfAdmiration) {
// This function is expecting a function to be passed to it
// because all it does is invoke what is passed and only
// functions can be invoked.
return objectOfAdmiration();
};
// Treat men like an object now and give it an isSweetHeart property with a value of true
women.isSweetHeart = true;
// Function expression that sets alients to hold a function
var aliens = function (objectOfAdmiration) {
// This function is expecting a function to be passed to it
// because all it does is invoke what is passed and only
// functions can be invoked.
return objectOfAdmiration();
};
// Function declaration for like.
// This function is expecting an object that has an isSweetHeart property.
// Since we have multiple types of objects that support that property, this
// function is polymorphic
function like(obj){
if (obj.isSweetHeart) {
// If the men or women objects are passed, this will be returned
return function (){ return "Holy TRUE!"};
}
else {
// Anything that doesn't have the isSweetHeart property or does
// but that property has a "falsey" value will end up here
return function (){ return "Holy CRAP!"};
}
}
// Invoke like(woman)...
// since the woman object does have an isSweetHeart property and that
// property has a value of true, the function that will return "Holy TRUE!"
// when it is invoked is returned.
// That function is then passed to the men function, which recieves it under
// the parameter name of "objectOfAdmiration".
// Invoking that function outputs "Holy TRUE!"
alert("Men like women is " + men(like(women))); // -> "Holy TRUE!"
// This line does just about the same as above, but in reverse and
// because the men and women functions are the same, the same output
// is produced.
alert("Women like men is " + women(like(men))); // -> "Holy TRUE!"
// Same general procedure as before, but since aliens do not even
// have an isSweetHeart property, a different function is returned
// for further processing.
alert("Men like aliens is " + men(like(aliens))); // -> "Holy CRAP!"
// This is essentially the same as the men(like(women)) function call
// except that the result of like(women) is passed to aliens, which
// Simply invokes that function.
alert("Aliens like women is " + aliens(like(women))); // -> "Holy TRUE!"
在阅读有关 Javascript First Class Functions here at SO 时,我遇到了这个 link: What is meant by 'first class object'? 其中我发现了这个有趣的例子:
var men = function (objectOfAdmiration) {
return objectOfAdmiration();
};
men.isSweetHeart = true;
var women = function (objectOfAdmiration) {
return objectOfAdmiration();
};
women.isSweetHeart = true;
var aliens = function (objectOfAdmiration) {
return objectOfAdmiration();
};
function like(obj){
if (obj.isSweetHeart) {
return function (){ return "Holy TRUE!"};
}
else {
return function (){ return "Holy CRAP!"};
}
}
alert("Men like women is " + men(like(women))); // -> "Holly TRUE!"
alert("Women like men is " + women(like(men))); // -> "Holly TRUE!"
alert("Men like aliens is " + men(like(aliens))); // -> "Holly CRAP!"
alert("Aliens like women is " + aliens(like(women))); // -> "Holly TRUE!"
我需要有人来解释这段代码,这里的执行方式。特别是表达式 men(like(women))
and/or women(like(men))
。这是如何产生最终结果的...
提前致谢
只要记住你的 "order of operations" 高中代数:
- 括号
- 指数
- 乘法
- 师
- 加法
- 减法
括号总是先求值。并且,在表达式具有嵌套括号集的情况下,内部集先于外部集计算。
因此,与:
men(like(women))
like
函数首先使用传递给它的 women
变量的值调用。
无论那个函数 returns 是传递给 men
函数的参数。像这样:
men( result of calling like(women) )
而且,women(like(men))
是同一个思路,只是颠倒了先调用的那个。
所以,让我们一步一个脚印。
- 首先认识到
men
、women
非常重要 和alien
函数实际上都是相同的。他们只是调用 无论你传递给他们什么,结果 return (在这种情况下 永远是另一个功能)。你可以推断出这一点,因为他们都 做的是在输入参数的末尾加上一组括号。 因此,他们每个人都期望传递一个函数(因为 这是您唯一可以调用的东西)。
因此,让我们少关注这些函数,多关注 like
函数,因为这是 return 与其调用者不同的函数。
阅读内联评论以获取解释:
// Function expression that sets men to hold a function
var men = function (objectOfAdmiration) {
// This function is expecting a function to be passed to it
// because all it does is invoke what is passed and only
// functions can be invoked.
return objectOfAdmiration();
};
// Treat men like an object now and give it an isSweetHeart property with a value of true
men.isSweetHeart = true;
// Function expression that sets women to hold a function
var women = function (objectOfAdmiration) {
// This function is expecting a function to be passed to it
// because all it does is invoke what is passed and only
// functions can be invoked.
return objectOfAdmiration();
};
// Treat men like an object now and give it an isSweetHeart property with a value of true
women.isSweetHeart = true;
// Function expression that sets alients to hold a function
var aliens = function (objectOfAdmiration) {
// This function is expecting a function to be passed to it
// because all it does is invoke what is passed and only
// functions can be invoked.
return objectOfAdmiration();
};
// Function declaration for like.
// This function is expecting an object that has an isSweetHeart property.
// Since we have multiple types of objects that support that property, this
// function is polymorphic
function like(obj){
if (obj.isSweetHeart) {
// If the men or women objects are passed, this will be returned
return function (){ return "Holy TRUE!"};
}
else {
// Anything that doesn't have the isSweetHeart property or does
// but that property has a "falsey" value will end up here
return function (){ return "Holy CRAP!"};
}
}
// Invoke like(woman)...
// since the woman object does have an isSweetHeart property and that
// property has a value of true, the function that will return "Holy TRUE!"
// when it is invoked is returned.
// That function is then passed to the men function, which recieves it under
// the parameter name of "objectOfAdmiration".
// Invoking that function outputs "Holy TRUE!"
alert("Men like women is " + men(like(women))); // -> "Holy TRUE!"
// This line does just about the same as above, but in reverse and
// because the men and women functions are the same, the same output
// is produced.
alert("Women like men is " + women(like(men))); // -> "Holy TRUE!"
// Same general procedure as before, but since aliens do not even
// have an isSweetHeart property, a different function is returned
// for further processing.
alert("Men like aliens is " + men(like(aliens))); // -> "Holy CRAP!"
// This is essentially the same as the men(like(women)) function call
// except that the result of like(women) is passed to aliens, which
// Simply invokes that function.
alert("Aliens like women is " + aliens(like(women))); // -> "Holy TRUE!"