Спосабы аб'явы функцый у JQuery

Я не разумею розніцу паміж спосабамі аб'явы функцый на JQuery, і некалькі разоў я страціў некаторы час, спрабуючы выклікаць функцыю, і гэта не працуе належным чынам, таму што не існуе ў кантэксце. Я нават не ведаю, калі гэта розныя спосабы аб'явы функцый на jQuery або калі ёсць іншы спосаб. Можа хто-то тут, патлумачце мне? Я цалкам нуб.

    $(function() {
       //Your code
    })

    jQuery(function($) {
       //Your code
    });

    function() {
       //Your code
    }
4
не забудзьцеся $ fn.openACSelect = функцыя() {} ;. , які дазваляе вызначыць свае ўласныя метады JQuery.
дададзена аўтар ogc-nick, крыніца

7 адказы

$(function() { })

... у дакладнасці эквівалентна ...

$(document).ready(function() {
});

Гэта будзе спрацоўваць функцыя ў той момант, DOM гатовы (DOMReady падзеі).

jQuery(function($) {
});

Ці з'яўляецца тое ж самае. У большасці наладка, $ : = jQuery (адзінае выключэнне ў выпадку асяроддзя NoConflict). Першы параметр закрыцця вы пераходзячы да jQuery будзе вяртаць jQuery <�код /> аб'ект. Такім чынам, гэтая функцыя проста паўторна карты $ у jQuery у дадатак да выканання менавіта тое, што іншы зрабіў.

Трэцяе зацвярджэнне з'яўляецца простай функцыяй дэкларацыі, якая не мае нічога агульнага з JQuery.

8
дададзена

<�моцны> Апавяшчэнне : Гэта сапраўды занадта доўга, але я спадзяюся, што хтосьці лічыць гэта карысным </р>.

Для пачатку: $ (ці jQuery , яны, як правіла, адно і тое ж) з'яўляецца функцыяй. На сваіх першых двух прыкладаў, вы выклікаеце гэтую функцыю, перадаючы ёй спасылку на ананімную функцыю. Гэта ярлык jQuery дадаць перададзеную функцыю як «document.ready» падзея слухач (фактычнае імя падзеі DOMContentLoaded у сумяшчальных браўзэрах).

JavaScript мае тры спосабу стварэння функцыі:

<�Моцны> 1. Аб'яву функцыі

function foo() {
   //code
}

У заяве, функцыя заўсёды павінна быць названа. У гэтым выпадку імя функцыі «Foo».

<�Моцны> 2. выраз функцыі

Можа быць пайменаваных ці не. Як правіла, яны ананімныя. Яны будуць лічыцца несапраўдным сінтаксісам у залежнасці ад становішча яны з'яўляюцца ў кодзе. Напрыклад, гэта памылка сінтаксісу:

// syntax error
function() {
   //code
}

Але гэта не так:

// passing a function expression is fine
foo(function() {
   //code
});

Гэта таксама справядліва:

// parentheses make it an expression too
(function() {
   //code
});

Гэта таксама:

// the negation operator also makes it be interpreted as an
// expression, instead of a syntax error
!function() {
   //code
}

Два былыя прыкладаў, як правіла, выкарыстоўваецца для неадкладнага выкліку функцыі:

!function() {
    alert('invoked')
}();

(function() {
    alert('invoked')
}());

Ізаляваныя, без якія заклікаюць дужкі, яны ў значнай ступені бескарыснымі, так як спасылкі на зноў створанай функцыі адразу губляецца, калі мы не будзем прыпісваць яго да чаго-небудзь.

Гэта з іншага боку, гэта вельмі карысна:

// function expressions are fine on the right-hand-side of an assignment
var fn = function() {
   //code
}

<�Моцны> 3. З дапамогай канструктара Function

// This is similar to 'eval'
// the string you pass will be the body of the function
var fn = new Function("return true");

Вы таксама сказалі, што вы збянтэжаныя пра функцыі і зменных, якія не існуюць у пэўным кантэксце. Гэта з-за аб'ёму: у JavaScript, кожная функцыя стварае новую вобласць . Калі вы ствараеце зменную (абвешчаная з дапамогай вар ) ці іншай функцыі (з выкарыстаннем любога з дапушчальных варыяцый вышэй), што пераменная або функцыя не будзе відаць звонку функцыі яна была абвешчаная ў. Але яны будуць бачныя ўнутры іншых ўкладзеных функцый, вызначаных у тым жа аб'ёме (укладзеныя функцыі «закрыць над» яны знешняй сферай, і таму іх звычайна называюць «закрыццём»).

7
дададзена
@ SébastienRenauld - Я згодны, што не чытае, як добра, але гэта было, вядома, цікавы спосаб, каб пераўтварыць функцыю ў выраз !.
дададзена аўтар Travis J, крыніца
TIL ! Функцыя() {}
дададзена аўтар Travis J, крыніца
@ SébastienRenauld - функцыя() {Alert ( "!");}()
дададзена аўтар Travis J, крыніца
@ SébastienRenauld - Справядліва. Але гэта таму, што выраз у truthy значэння ў другім выпадку, так што спадзяюся, ніхто не спрабуе, што чакае выканання функцыі :)
дададзена аўтар Travis J, крыніца
@ SébastienRenauld Удакладнены.
дададзена аўтар bfavaretto, крыніца
@TravisJ TIL "TIL" (я павінен быў Google гэта).
дададзена аўтар bfavaretto, крыніца
@ SébastienRenauld Звярніце ўвагу, што я не кажу пра іх выкананне на ўсіх тут (хай мой адказ трохі <�я> таксама </я> тэарэтычная).
дададзена аўтар bfavaretto, крыніца
@bfavaretto: Усё добра. Я upvote, але я ўжо upvoted.
дададзена аўтар Sébastien Renauld, крыніца
@TravisJ: справа была ў бок, а не выпраўленне да адказу. Гэта можа ўвесці ў зман, каб убачыць, як змясціць бок аб бок без IETF() з, і можа прывесці людзей думаць, што яны аналагічныя. Гэта ўсе.
дададзена аўтар Sébastien Renauld, крыніца
@TravisJ: Я ведаю, што гэта, і гэта сутнасць майго другога зацвярджэння. Я проста кажу, што два паводзяць сябе па-рознаму: вар да = (функцыя() {}); да (); будзе працаваць. вар да = функцыя() {}; да() не будзе.
дададзена аўтар Sébastien Renauld, крыніца
Дзве невялікія папраўкі: функцыя() {} і (функцыя() {}) з'яўляюцца толькі дэклярацыямі, а першы не служыць мэтам, ня выкананы на ўсіх ( вы губляеце даведачна момант вы ствараеце яго з-за унарный). <�Код>! (Функцыя() {})() гэта добра, хоць. Fiddle: tinker.io/57c3d/1
дададзена аўтар Sébastien Renauld, крыніца

Памятаеце, што сімвалы ў JavaScript могуць быць імёны зменных. Такім чынам, у крыніцы jQuery ёсць нешта падобнае на гэта вызначэнне:

var $ = jQuery = windw.jQuery;

Дзе ўсе тыя тыя ж пераменнае. Я паказваю, што з-за $() і JQuery() абодва тое ж самае.


Гэта фактычна ярлык для jQuery.ready (), дзе аргумент, перадаваны з'яўляецца зваротным выклікам, калі дакумент загружаны ў адпаведнасці з JQuery. Калі вы размяшчае функцыя() {} у якасці аргументу, вы ствараеце ананімную функцыю, і гэта тое, што запускаецца на выкананне, калі функцыя выклікаецца.

$(function() {//passing anonymous function
   //Your code
})

Гэта на самай справе не правільны код, таму што ён павінен мець імя. Ён будзе кідаць выключэнне «SyntaxError: Нечаканы маркер (».

function() {
   //Your code
}
3
дададзена

Трэцяя адна функцыя дэкларацыі, якая служыць ні да чаго, як функцыі, як без імя і не называецца, у той час як першыя два з іх эквівалентныя ($ гэта псеўданім для JQuery) спосабы задаваць JQuery, каб выклікаць функцыю, калі DOM гатовая. Гэта таксама эквівалентна

$(document).ready(function(){
})

See http://api.jquery.com/ready/

2
дададзена
Без дужкі, каб зрабіць гэты выраз, і, калі ён не прызначаны, я думаю, што гэта так бескарысна, нават не заслугоўвае назвы.
дададзена аўтар Denys Séguret, крыніца
Для мяне # 3 з'яўляецца ананімнай функцыі выраз (або памылка сінтаксісу)
дададзена аўтар bfavaretto, крыніца
@ SébastienRenauld Не, дэкларацыі павінны быць названыя.
дададзена аўтар bfavaretto, крыніца
@bfavaretto: Так. Такім чынам, яго трэцяе заяву кідае сінтаксічную памылку. Па-за яе кантэксту, гэта можа быць ананімная функцыя, IETF, або функцыя ДЕЦЛ на падставе наяўнасці прысваення вару ці двайны набор дужак.
дададзена аўтар Sébastien Renauld, крыніца
@bfavaretto: было б у IETF, калі гэта (функцыя() {})() . Як яна стаіць, гэта проста аб'яву функцыі.
дададзена аўтар Sébastien Renauld, крыніца

Першыя два спосабу выкліку функцыі, з'яўляюцца ярлык $ (дакумент) .ready() <�код /> функцыі. Гэта азначае, што калі вы выклікаеце тэму ўнутры гэтага $ або jQuery яны будуць выконваць, як гэта. Звярніцеся да http://api.jquery.com/ready/ ! Трэці ставіцца да нармальнай функцыі выкліку. Розніца beetwen выкарыстоўваючы $ або jQuery для рэчаў канфліктаў з іншымі бібліятэкамі.

2
дададзена
Трэці адзін не з'яўляецца ананімнай функцыі выкліку.
дададзена аўтар Sébastien Renauld, крыніца

У JavaScript, вы можаце перадаць функцыі іншых функцый. Калі вы бачыце нешта накшталт

$('div').click(function() {
    alert("clicked");
});

вы перадаеце ананімную функцыю ў якасці аргументу націсніце() метад, які проста выконвае функцыю, якую вы даеце яму.

Такім чынам, вы маглі б дасягнуць таго ж выніку з

function runOnClick() { alert("clicked"); }

$('div').click(runOnClick);
1
дададзена

JQuery не з'яўляецца мовай праграмавання. Гэта бібліятэка, напісаная ў JavaScript для JavaScript. Правілы аб'явы функцыі ў JavaScript з'яўляюцца адзінымі, якія вы павінны прытрымлівацца. jQuery не падае новы спосаб вызначэння функцый.

Яны не з'яўляюцца дапушчальнымі азначэннямі функцый:

$(function() {
   //Your code
})

jQuery(function($) {
   //Your code
});

Гэта цвёрдае вызначэнне функцыі:

function myFavoriteFunction() {
   //Your code
}
0
дададзена