Javascript jQuery如何进行方法链接?

Javascript jQuery如何进行方法链接?,javascript,jquery,Javascript,Jquery,可能重复: 这是在jQuery代码中常见的情况: $("div.selected").html("Blah."); 因此,在上面的代码中,在函数$()中,它有一个名为html()的函数。我不明白的是,我通常会做的是: funcA("blah"); //normal function, cool. funcA.funcB("blah"); //normal function in an object, still cool. 现在这令人困惑: funcA("blah").funcB("b

可能重复:

这是在jQuery代码中常见的情况:

$("div.selected").html("Blah.");
因此,在上面的代码中,在函数
$()
中,它有一个名为
html()
的函数。我不明白的是,我通常会做的是:

funcA("blah");  //normal function, cool.
funcA.funcB("blah");  //normal function in an object, still cool.
现在这令人困惑:

funcA("blah").funcB("blah")  //huh??
funcB
如何知道
funcA
中的参数?
jQuery如何实现这一点


谢谢。

jquery中的大多数函数都返回一个包含一组元素的jquery对象
html
不确切地知道
$()
的参数,更重要的是
$()
的结果有一组元素,这些元素是根据传递给
$()
的参数创建的

但是,在您的
funcA
funcB
示例中,可以很容易地让
funcA
返回一个名为
funcB
的函数的对象。此对象还可以包含传递给
funcA
的值,然后调用
funcB
也可以“知道”该值


jquery中的大多数函数都返回一个包含一组元素的jquery对象
html
不确切地知道
$()
的参数,更重要的是
$()
的结果有一组元素,这些元素是根据传递给
$()
的参数创建的

但是,在您的
funcA
funcB
示例中,可以很容易地让
funcA
返回一个名为
funcB
的函数的对象。此对象还可以包含传递给
funcA
的值,然后调用
funcB
也可以“知道”该值

当您执行
funcA(“blah”).funcB(“blah”)
时,无论
funcA
返回什么,都会调用
funcB
。因此,您需要
funcA
返回具有
funcB
的某个对象,然后调用该对象

在jQuery的情况下,大多数jQuery函数都返回jQuery对象,因此函数调用可以按您的喜好进行链接。许多jQuery函数设计用于修改返回的jQuery对象的内容。因此,在您的示例中,对
html()
“的调用并不知道”传递给
$()
函数的内容。相反,
$()
函数返回一个jQuery对象,该对象指向与给定选择器匹配的DOM元素。然后,对该jQuery对象上的函数的进一步调用将影响那些选定的元素。

当您执行
funcA(“blah”).funcB(“blah”)
,则对
funcA
返回的任何内容调用
funcB
。因此,您需要
funcA
返回具有
funcB
的某个对象,然后调用该对象

function funcA(arg1) {

    var enclosedVariable= arg1;

    return {
       funcB: function () {
          alert(enclosedVariable);
       }
    };
}
在jQuery的情况下,大多数jQuery函数都返回jQuery对象,因此函数调用可以按您的喜好进行链接。许多jQuery函数设计用于修改返回的jQuery对象的内容。因此,在您的示例中,对
html()
“的调用并不知道”传递给
$()
函数的内容。相反,
$()
函数返回一个jQuery对象,该对象指向与给定选择器匹配的DOM元素。然后,对jQuery对象上的函数的进一步调用将影响这些选定的元素

function funcA(arg1) {

    var enclosedVariable= arg1;

    return {
       funcB: function () {
          alert(enclosedVariable);
       }
    };
}
下面是一个简单的例子^^

funcA
接受一个参数并保存它,然后返回一个包含单个函数的对象。它已经“封闭”,现在
funcB
可以访问它

从技术上讲,你甚至不需要保存它<代码>arg1也可用于
funcB

//function returning an object is a possibility. bar has access to elem because of
// the shared scope
function foo ( elem ) {
    return {
        bar : function () {
            return elem.id;
        }
    };
}
下面是一个简单的例子^^

funcA
接受一个参数并保存它,然后返回一个包含单个函数的对象。它已经“封闭”,现在
funcB
可以访问它

从技术上讲,你甚至不需要保存它<代码>arg1也可用于
funcB

//function returning an object is a possibility. bar has access to elem because of
// the shared scope
function foo ( elem ) {
    return {
        bar : function () {
            return elem.id;
        }
    };
}
在本例中,
foo
函数返回一个对象,该对象包含您想要的任何方法。因此,当您调用
foo
时,您会收到以下信息:

{
    bar : function () {
        return elem.id;
    }
}
elem
在您呼叫
foo
时出现。如果要在
栏的顶部添加
console.log(elem)
,您会看到它与传递给
foo
的内容相同

//this is kinda how jQuery does it:
var foo = (function() {
    function foo ( elem ) {
        this.elem = elem;
    }

    foo.prototype.bar = function () {
        return this.elem.id;
    };

    return function ( elem ) {
        return new foo( elem );
    };
}());
这有点复杂,实际上分为两部分

function foo ( elem ) {
    this.elem = elem;
}

foo.prototype.bar = function () {
    return this.elem.id;
};
谁不喜欢混合了经典继承名的原型继承?无论如何,函数既可以作为常规函数,也可以作为构造函数。这意味着,当使用
new
关键字调用时,会发生两种特殊情况:

  • 这是
    foo
    内部的
    foo.prototype
  • 返回
    foo.prototype
    (除非
    foo
    返回对象)
  • 请注意,
    foo.prototype
    不是一个神奇的值。它与任何其他对象属性一样

    因此,在
    foo
    函数/构造函数中,我们只是设置
    foo.prototype.elem
    ,而不是直接设置。这样想(有点不准确,但可以):
    foo.prototype
    是产品的蓝图。每当你想做更多的时候,你就使用蓝图——复制里面的东西,并把它传下去。在
    foo
    内部,
    指的是蓝图的这种复制

    然而,通过在
    foo.prototype
    上显式设置值,我们正在改变蓝图本身。无论何时调用
    foo
    ,都会使用这个修改过的蓝图来调用它

    最后,一旦
    foo
    完成,就会返回复制(复制的蓝图,但在
    foo
    完成了相关工作之后)。此复制包含原始蓝图,以及我们在本次考试中可能添加的所有其他内容
    var answer = (function () {
        return 42;
    }());
    answer ==== 42;
    
    var counter = (function () {
        var c = 0;
        return function () {
            return c++;
        };
    }());
    //counter is now a function, as a function was returned
    counter(); //0
    counter(); //1
    counter(); //2...
    
    var foo = (function () {
        ...
        return function ( elem ) {
            ...
        };
    }());
    
    return new foo( elem );
    
    function foo ( elem ) {
        this.elem = elem;
    }
    foo.prototype.bar = function () {...};
    
    function $() {
        return {
            html: function() {
            }
        };
    }
    
    $().html(); // You just called the function!
    
    var obj = {
        doSomething: function() {
            return this;
        },
        doSomethingElse: function() {
            alert('Hi!');
        }
    };
    
    obj.doSomething().doSomethingElse(); // Alerts "Hi!"
    
    objectOfA->methodOfA(arg)->methodOfB(args);
    
    $('div.selected').html('Blah ..')
    
    $class->method1(argument)->method(2) 
    
    def function1(name):
        return name
    
    def function2(arg):
        print len(name)
    
    function2(function1('My Name is blah ...'))