Nima uchun bu kod abadiy pastadir/rekursivga olib keladi?

Quyidagi JavaScript kodim bor:

var original_selectCallback = window.selectCallback;
var selectCallback = function(variant, selector) {
  original_selectCallback(variant, selector);
  console.log(variant + " " + selector);
};

Har qanday tarzda, ikkinchi qator:

var selectCallback = function(variant, selector) 

SelectCallback-ni tanlash uchun rekursiv chaqiruv olib boradi. Mening tushunishim - selectCallback funksiyasini qayta belgilash. Xo'sh, bu nima uchun rekordiv chaqiruv bo'lishi mumkin? Har qanday takliflar/tavsiyalar qadrlanadi.

3
selectCallback aslida o'zini allaqachon chaqirib olmagan va o'z-o'zidan aytiladigan qiymatni yoki o'z-o'zidan nusxa olishni to'xtatib turadigan biror narsa bo'lmaguncha, bu o'z-o'zidan emas.
qo'shib qo'ydi muallif plalx, manba
selectCallback aslida o'zini allaqachon chaqirib olmagan va o'z-o'zidan aytiladigan qiymatni yoki o'z-o'zidan nusxa olishni to'xtatib turadigan biror narsa bo'lmaguncha, bu o'z-o'zidan emas.
qo'shib qo'ydi muallif plalx, manba
Sizning savolingizni unutdingizmi?
qo'shib qo'ydi muallif plalx, manba
Sizning savolingizni unutdingizmi?
qo'shib qo'ydi muallif plalx, manba
window.selectCallback ning asl ta'rifini qo'sha olasizmi?
qo'shib qo'ydi muallif David Hedlund, manba
window.selectCallback ning asl ta'rifini qo'sha olasizmi?
qo'shib qo'ydi muallif David Hedlund, manba
Kod birinchi marta ishlashi kerak, ammo sahifa yangilashdan so'ng muvaffaqiyatsiz bo'ladi. sahifani yangiladingizmi?
qo'shib qo'ydi muallif Nikhil Aggarwal, manba
Kod birinchi marta ishlashi kerak, ammo sahifa yangilashdan so'ng muvaffaqiyatsiz bo'ladi. sahifani yangiladingizmi?
qo'shib qo'ydi muallif Nikhil Aggarwal, manba
Sizning savolingizni ko'rib chiqa olmayapmanmi?
qo'shib qo'ydi muallif Álvaro Touzón, manba

6 javoblar

Bu yerda hech qanday recursion yo'q va buni ko'rsatish juda oson:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

let someFn = function() { console.log('original'); };
let originalSomeFn = someFn;

someFn = function() {
  originalSomeFn();
  console.log('decorated');
};

someFn();
</div> </div>

Shu bilan birga, asl funktsiyani o'zida takrorlash algoritmiga jalb qilish mumkin va sizning dastlabki funktsiyangiz asl funktsiyaning to'g'ri xulq-atvorini to'liq bajarmasligi mumkin.

Bu erda asl vazifani qanday qilib saralab olishingiz kerakligiga ishonch hosil qilish uchun. Bundan tashqari, global originalSomeFn o'zgaruvchidan qochish uchun yopilishni tanladim.

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

let someFn = function() {
    console.log('original');
    return 1;
};

someFn = (function (originalSomeFn) {
  return function() {
    let result = originalSomeFn.apply(this, arguments);

    console.log('decorated');

    return result;
  };
})(someFn);

console.log(someFn());
</div> </div>
1
qo'shib qo'ydi

Bu yerda hech qanday recursion yo'q va buni ko'rsatish juda oson:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

let someFn = function() { console.log('original'); };
let originalSomeFn = someFn;

someFn = function() {
  originalSomeFn();
  console.log('decorated');
};

someFn();
</div> </div>

Shu bilan birga, asl funktsiyani o'zida takrorlash algoritmiga jalb qilish mumkin va sizning dastlabki funktsiyangiz asl funktsiyaning to'g'ri xulq-atvorini to'liq bajarmasligi mumkin.

Bu erda asl vazifani qanday qilib saralab olishingiz kerakligiga ishonch hosil qilish uchun. Bundan tashqari, global originalSomeFn o'zgaruvchidan qochish uchun yopilishni tanladim.

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

let someFn = function() {
    console.log('original');
    return 1;
};

someFn = (function (originalSomeFn) {
  return function() {
    let result = originalSomeFn.apply(this, arguments);

    console.log('decorated');

    return result;
  };
})(someFn);

console.log(someFn());
</div> </div>
1
qo'shib qo'ydi

Kodni tekshirib chiqamiz:

var original_selectCallback = window.selectCallback;

selectCallback funktsiyasiga mos keladigan yangi o'zgaruvchini yaratadi.


var selectCallback = function(variant, selector) {

window.selectCallback funktsiyasini yaratadi (chunki window maydonida mavjud).


Endi funktsiyaning ichki qismi

original_selectCallback(variant, selector);

hozirda qaerda joylashgan bo'lsa, xuddi shu funktsiyasi bo'lgan window.selectCallback bilan bir xil bo'lgan window.original_selectCallback deb nomlanadi.

Shunday qilib, hech qachon nihoyasiga etilmagan selectCallback bilan takrorlashni amalga oshirasiz.

1
qo'shib qo'ydi

Kodni tekshirib chiqamiz:

var original_selectCallback = window.selectCallback;

selectCallback funktsiyasiga mos keladigan yangi o'zgaruvchini yaratadi.


var selectCallback = function(variant, selector) {

window.selectCallback funktsiyasini yaratadi (chunki window maydonida mavjud).


Endi funktsiyaning ichki qismi

original_selectCallback(variant, selector);

hozirda qaerda joylashgan bo'lsa, xuddi shu funktsiyasi bo'lgan window.selectCallback bilan bir xil bo'lgan window.original_selectCallback deb nomlanadi.

Shunday qilib, hech qachon nihoyasiga etilmagan selectCallback bilan takrorlashni amalga oshirasiz.

1
qo'shib qo'ydi

Siz qo'ygan kod bilan tabiiy ravishda noto'g'ri narsa yo'q:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

var selectCallback = function() { console.log('original'); };
var original_selectCallback = selectCallback;
var selectCallback = function() {
 original_selectCallback();
 console.log('wrapper');
};
selectCallback();
</div> </div>

Xato, bu erda ko'rsatilmagan window.selectCallback boshlang'ich tavsifida bo'lishi mumkin.

1
qo'shib qo'ydi

Siz qo'ygan kod bilan tabiiy ravishda noto'g'ri narsa yo'q:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

var selectCallback = function() { console.log('original'); };
var original_selectCallback = selectCallback;
var selectCallback = function() {
 original_selectCallback();
 console.log('wrapper');
};
selectCallback();
</div> </div>

Xato, bu erda ko'rsatilmagan window.selectCallback boshlang'ich tavsifida bo'lishi mumkin.

1
qo'shib qo'ydi
Javascript UZB
Javascript UZB
99 ishtirokchilar

@js_uzb @vuejs_uz @react_uz @nodejs_uz @angular_uz @ngTashkent @yiiframework_uz @laravel_uz @linux_uzbek @python_uz @swift_uzb —————— @uzdevgroup @UzGeeksGroup ——— @UzDev_Jobs @jobs_uzb