Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Функции в PHP и JS
J1upuk  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Старик
***

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 132
Пользователь №: 37693
На форуме: 3 года, 5 месяцев, 11 дней
Карма: 1




Вопрос не очень умный, т.к. касается сравнения 2-х разных языков, но всё-таки, объясните почему так:
PHP:

function foo()
{
function bar()
{
echo 'inside';
}
}


foo();
bar(); // inside


В тоже время:
JS

function foo()
{
function bar()
{
cosole.log('inside');
}
}


foo();
bar(); // Uncaught ReferenceError: bar is not defined


И последний, самый интересный пример:


function foo()
{
$('#btn').click(function() {
bar();
});

function bar()
{
console.log('BAR');
}
}


foo();
bar(); // Uncaught ReferenceError: bar is not defined

/*
* Но по нажатию на кнопку коллбэк срабатывает, хоть и находится внутри foo(); Да и
* вызывает функцию bar(), которая тоже внутри foo();
*/




В чем разница в областях видимости в этих языках, объясните пожалуйста) Возникают некоторые недопонимания в изучении JS после использования PHP. Особенно интересен 3тий пример.
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
bestxp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



орангутанг
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2004
Пользователь №: 36605
На форуме: 3 года, 9 месяцев, 15 дней
Карма: 111




область видимости, функция bar входит в область видимости внутри foo, то есть наружу оно никак не выглядывает, в случае если у тебя клиентский js тогда тебе надо объявить так

function foo()
{
window.bar = function(){
cosole.log('inside');
}
}


тогда верхняя область видимости узнает о функции bar

ps грубо говоря в js все что внутри скобок то внутри скобок и вверх не лезет, зато из скобок вверх по иерархии можно)


--------------------
PMПисьмо на e-mail пользователюСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
depp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 290
Пользователь №: 40589
На форуме: 1 год, 11 месяцев, 29 дней
Карма: 19




в php это не относится к области видимости. так как написано в вашем примере - не делают.

в js это реально область видимости. там вы можете объявить функцию внутри функции и использовать ее внутри этой же функции. при этом за пределами она не будет доступна.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
J1upuk  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Старик
***

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 132
Пользователь №: 37693
На форуме: 3 года, 5 месяцев, 11 дней
Карма: 1




bestxp
А можно по 3-му примеру комментарий? Функции за которыми закреплено событие поднимаются в глобальную область видимости? Или же закрепляя событие на на какой либо элемент, мы прикрепляем к нему некий референс на функцию, в котором указана ее область видимости?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14965
Пользователь №: 4190
На форуме: 8 лет, 9 месяцев, 26 дней
Карма: 443




Цитата (depp @ 10.02.2016 - 17:21)
в php это не относится к области видимости. так как написано в вашем примере - не делают.

Очень даже делают :) Пока не запустишь функцию foo(), функция bar() не появится. То есть, можно сделать своего рода библиотеки функций. Запустил одну основную, появился определенный набор функций. Если же запустил другую, то появился другой набор функций с теми же названиями, но другим содержанием.
В ПХП когда ты объявил функцию, то он становится доступной в любом месте.

По 3-му примеру. Область видимости функции bar() - всё, что находится внутри функции foo(). Она видна всем объектам, в т.ч. изнутри обработчика нажатий.
Внутри другой функции ты можешь объявить внутреннюю функцию с точно таким же именем, она будет внутренней там.

PS. В JS что переменная, что функция - насчет областей видимости одно и то же. Но, мне кажется, с переменными будет более наглядно.
function foo() {
var a = 5;
var c = 15;

function bar() {
var b=1;
var a = 10;
с = 20;
console.log( a ); // получим 10 - это внутренняя для bar() переменная
console.log( c ); // получим 20 - это внешняя для bar() переменная, но внутренная для foo()
return b;
}

console.log( a, b, c ); // 5, undefined, 15
console.log( bar() ); // получим 1
console.log( a, b, c ); // 5, undefined, 20
}

console.log( a, b, c ) ; // все переменные недоступны



Это сообщение отредактировал sergeiss - 10.02.2016 - 19:20


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
icedfox  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 395
Пользователь №: 41702
На форуме: 1 год, 3 месяца, 20 дней
Карма: 13




по третьему примеру все таже область видимости. попробуй
$('#btn').trigger('click');
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса