[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Функции в PHP и JS
J1upuk
Вопрос не очень умный, т.к. касается сравнения 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тий пример.
bestxp
область видимости, функция bar входит в область видимости внутри foo, то есть наружу оно никак не выглядывает, в случае если у тебя клиентский js тогда тебе надо объявить так

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


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

ps грубо говоря в js все что внутри скобок то внутри скобок и вверх не лезет, зато из скобок вверх по иерархии можно)
depp
в php это не относится к области видимости. так как написано в вашем примере - не делают.

в js это реально область видимости. там вы можете объявить функцию внутри функции и использовать ее внутри этой же функции. при этом за пределами она не будет доступна.
J1upuk
bestxp
А можно по 3-му примеру комментарий? Функции за которыми закреплено событие поднимаются в глобальную область видимости? Или же закрепляя событие на на какой либо элемент, мы прикрепляем к нему некий референс на функцию, в котором указана ее область видимости?
sergeiss
Цитата (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 ) ; // все переменные недоступны



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

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

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

user posted image
icedfox
по третьему примеру все таже область видимости. попробуй
$('#btn').trigger('click');
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.