2016-03-12 4 views
1

Я играл с обратными вызовами и сталкивался с этой проблемой, не зная, как это связано с обратными вызовами, но я не могу объяснить результат, любая помощь будет принята с благодарностью.Проблемы с обратным вызовом в javascript

Почему результат: 'hi samsamsamsamsamsamsamsamsamsamsamsam',

Я бы ожидать: 'hi sam'


function addSam(cb){ 
    var name = ''; 
    setTimeout(function(){ 
     name += 'sam'; 
     cb(); 
    }, 1000); 
} 

function speak(){ 
    console.log('hi ' + name); 
} 

Когда я звоню addSam(speak), на консоль возвращается:

'hi samsamsamsamsamsamsamsamsamsamsamsam'

Почему имя + = 'sam' происходит несколько раз?

Как я должен изменить код так, это происходит только один раз, и я могу выход просто:

hi sam

+0

Ваш код будет печатать только ' "привет"'. Я чертовски уверен –

+0

Это невозможно, хотя бы с кодом, который вы опубликовали. Я уверен, что у вас есть что-то еще, что вы здесь не позируете. Или вам не хватает 'var name = '';' в вашем реальном коде. – dfsq

+0

Извините, я должен был быть ясен, я запускаю: addSam (говорить) в конце этого, это печатает «hi samsamsamsamsamsamsamsamsamsamsamsam» в консоли –

ответ

2

Это происходит потому, что переменная name была определена внутри addSam функции, поэтому он будет доступен только в том, что а не глобально.

Если вы хотите, чтобы функция выводила hi sam, когда она называется addSam(speak), определите name переменную за пределами функции, чтобы ее можно было получить глобально. Как это:

var name = ''; 
function addSam(cb){ 
    setTimeout(function(){ 
     name += 'sam'; 
     cb(); 
    }, 1000); 
} 

function speak(){ 
    console.log('hi ' + name); 
} 

addSam(speak); // outputs 'hi sam' after a second 
+0

Хороший ответ, спасибо –

2
function addSam(cb){ 
    var name = ''; 
    setTimeout(function(){ 
     name += 'sam'; 
     cb(name); 
    }, 1000); 
} 

function speak(name){ 
    console.log('hi ' + name); 
} 
Смежные вопросы