2012-01-13 151 views
0

我有这样的:运行函数中的函数

function cool(){ 
    function alsocool(){ 

    } 
} 

和我按一下按钮运行凉():

$(selector).on('click', function(){ 
cool(); 
} 

如何运行的cool()alsocool()从同样的点击?请注意,我想做的事:

function cool(){ 
    function alsocool(){ 

    } 
    alsocool(); 
} 

如果我做的:

$(selector).on('click', function(){ 
    cool(); alsocool(); 
    } 

这是行不通的。

是否有可能在同一个调用中的函数内部运行函数?

编辑:

我确实想通过cool()因为显然alsocool()没有一次其内部功能cool()cool();公认是从许多选择过去了因此,我想知道从哪个选择是通过采取适当的行动。

例子我想是这样的:

function cool(){ 

// If this was called by button1, run alsocool() else bypass it 
     function alsocool(){ 

     } 
// some code goes here 

} 

$("#button1").on('click', function(){ 
     cool(); alsocool(); 
     // If button1 clicked, run cool AND alsocool 
     } 
$("#button2").on('click', function(){ 
     cool(); // If button2 clicked, run cool ONLY. 
    } 
+1

你能解释你为什么*不想做你描述的嵌套定义/调用吗?这是显而易见的解决方案,所以如果你解释为什么它不适合你,它将帮助其他人创造更好的答案。 – maerics 2012-01-13 16:14:58

+1

你能详细说一下吗?什么是需要你的嵌套功能的条件? alsocool是一个很酷的本地函数,不能在其外部调用。将alsocool移出,或者在其内部调用它。那些是我看到的唯一选择。你有链接或完整的样本来说明你的约束吗? – 2012-01-13 16:18:04

+0

对不起,不清楚。我编辑了我的问题。 – jQuerybeast 2012-01-13 16:25:41

回答

2

答案很简单:这是不可能的。
内部函数对于包含函数的作用域是局部的,所以除非该函数调用它,否则根本不能调用它。

如果您希望可以从外部访问这两种功能,请在cool之外定义alsocool,即与cool的级别相同。


根据您的评论,下面是一个会用一个参数来确定内部函数应该被称为与否的方式:

function cool(callInner){ 
    function alsocool(){ 

    } 
    if(callInner) { 
     alsocool(); 
    } 
} 
+0

真的吗?没有任何hacky的方式来传递一个变量:cool(abc);然后在函数cool()内部,如果abc通过,请执行alsocool()? – jQuerybeast 2012-01-13 16:15:44

+1

这当然是可能的,但你明确表示你不想在函数内部调用它! – ThiefMaster 2012-01-13 16:16:21

+0

正是我在找的东西。对不起,不清楚。我编辑了我的问题。 – jQuerybeast 2012-01-13 16:22:43

1

的问题是,因为你定义的函数alsocoolcool之内,它的可见度仅限于该范围。

因此,您可以只有cool调用函数alsocool

你可以,当然,移动alsocoolcool的声明,这将仍然允许您呼叫alsocoolcool内,但你将从alsocool松访问的cool范围。

根据传递的参数,您也可以限制alsocoolcool之内的调用,如果这是您可行的选项;

function cool(alsoAlsoCool){ 
    function alsocool(){ 

    } 

    if (alsoAlsoCool) { 
     alsocool(); 
    } 
} 

// cool(true) will call it, but cool() or cool(false) won't. 
+0

谢谢。这正是我所期待的。 @ThieftMaster回答更快,因此我会接受他的回答。谢谢你。 – jQuerybeast 2012-01-13 16:24:40

2

如果你

function cool() { 
    function alsocool() { ... } 
} 

然后 'alsocool',而酷()函数执行时存在。它不会从外部访问。

你会想:

function cool() { ... } 
function alsocool() { ... } 

$(selector).click(function() { 
    cool(); 
    alsocool(); 
}): 
+0

请参阅我的编辑 – jQuerybeast 2012-01-13 16:22:12

+0

感谢您的回答并对不起,我首先不清楚 – jQuerybeast 2012-01-13 16:28:06

1

你不能做到这一点。 alsocool只存在于cool内,点击处理程序不知道alsocool存在。

如果你不想从cool内部拨打alsocool,那么你将不得不使alsocool全球。

+0

我明白,因此我先传递cool(),然后再通过alsocool()方法传递。例如:IF selector1单击,传递cool()然后alsocool()。如果selector2点击,只传递cool()?不是有可能吗? – jQuerybeast 2012-01-13 16:17:24

+0

@Jonathan:你可以让'cool'返回'alsocool',然后调用它需要的。你也可以将元素传递给'cool',并让它确定是否调用'alsocool'或不。 – 2012-01-13 16:19:34

+0

抱歉不清楚。我编辑了我的问题。什么小偷大师回答我想它是我正在寻找的。谢谢 – jQuerybeast 2012-01-13 16:23:30

1

我不明白你为什么要这么做,但你可以这样做:

function cool() 
{ 
    arguments.callee.alsoCool = function() { 
     alert("also cool"); 
    }; 

    alert("cool"); 
} 

$("#b").click(function() { 
    cool(); 
    cool.alsoCool(); 
}); 

现场演示:http://jsfiddle.net/ENqsZ/

另外,作为火箭队的建议,你可以这样做:

function cool() 
{ 
    alert("cool"); 

    return function() { 
     alert("also cool"); 
    }; 
} 

$("#b").click(function() { 
    var alsoCool = cool(); 

    alsoCool(); 
}); 
+1

我建议返回一个函数,而不是使用'arguments.callee'。 – 2012-01-13 16:20:32

+0

我认为它不是Rocket建议的。请参阅ThieftMaster的回答 – jQuerybeast 2012-01-13 16:29:09