Как объявить глобальную переменную из функии?
Как объявить глобальную переменную из функии?
Например:
var playerUrl
function playRTrack(playerId, myArray) {
var rIndex = Math.floor(Math.random()*(arr.length));
var rElement = arr[rIndex];
var myPlayer = document.getElementById('player');
var playerUrl = myUrl + rElement;
var myDownload = document.getElementById('myDownload');
myDownload.setAttribute("href", playerUrl);
myPlayer.setAttribute("src", playerUrl);
myPlayer.play();
}
Чтобы значение переменной playerUrl стало глобальным...:help: |
window.playerUrl = 1 |
Универсальный способ, работает не только в браузерах, но и там, где windows нет. Не совместим с "use strict" :-(
function f() {
(function(){return this;})().playerUrl = 1;
}
f();
alert( typeof playerUrl + ": " + playerUrl );
А можно просто присвоить значение не объявляя (т.е. без слова var) |
Цитата:
и что бы не лепить то что ты слепил, можно сделать гораздо проще. И безо всяких функций: var global = window || this; global.ololo = 1; alert(ololo); "use strict" var global = window || this; global.ololo = 1; alert(ololo); |
Кста, таким способом можно доступиться внутри функции до глобальной переменной даже если в функции объявлена одноименная локальная:
var test = "global test";
function f() {
var test = "local test";
alert( test );
alert( (function(){return this;})().test );
(function(){return this;})().test = "new value"
}
f();
alert( test );
|
Цитата:
|
Цитата:
var global = window || this;
var test = "global test";
function f() {
var test = "local test";
alert( test );
alert( global.test );
global.test = "new value"
}
f();
alert( test );
|
Цитата:
я обычно пишу так:
(function(window) {
...
})(window || this);
|
Цитата:
var global = window || this; - абсолютно бессмысленная конструкция, т.к. там где window есть, не нужна, а там где нет - падает. Так что: var global = (function(){return this;})(); // :yes: |
Цитата:
var global = (function(){return this || window})();
|
при включении строгого режима:
"use strict";
var global = (function(){return this || window})();
alert(global);
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
devote,
Если windows есть, то да, все нормально, а если нет - ПАДАЕТ. Разговор вообще какой-то беспредметный, трудно придумать случай, когда пишущий скрипт не знает, для браузера от пишет или нет, т.е. есть window или нет. Нет, можно конечно писать какие-то универсальные функции, которые потом используются и там и сям, но в этом случае в глобальные переменные лазить не надо. Никогда не надо, но в этом случае - особенно. Кста, для экспериментов без браузера использую 1. Windows Script Host - движок тот же, что у шестого IE, даже под windows 7, в которую входит 9-й IE, в Windows Script Host движок от шестого. 2. V8 - движок от гугла, тот же, что и в хроме. Можно скачать исходники и собрать. Также можно скачать и собрать движок от мозилы Spider Monkey, но я им не пользовался. |
Цитата:
var global = (function(self){return this || typeof window !== 'undefined' && window || self})(this);
Тут у нас получилось простое решение, если нет объекта this (то есть оно равно null) попытаемся получить window, и если и оно не определено, то тогда просто возвращаем ссылку на текущий контекст. |
В Node.JS глобальный объект имеет имя global, вот решение с учетом этого:
var global = (function(self){
return typeof global !== 'undefined' && global || this || typeof window !== 'undefined' && window || self;
})(this);
|
Цитата:
|
Цитата:
Простой вызов cscript z.js не вызывает проблем. z.js
(function(that)
{
that.a = function()
{
WScript.Echo(1);
};
})(this);
a();
Этот вызов cscript z.wsf приведет к краху скрипта. z.wsf <?xml version="1.0" encoding="utf-8" ?> <package> <job id="crash"> <script language="javascript" src="z.js"></script> </job> </package> Пока это единственное решение проблемы: // вариант 1 a.call(); a.apply(); // вариант 2 b = a; b(); А лучше - отказаться от такого способа объявления функций, или изменить структуру скрипта, чтобы избежать этого. |
with-love-from-siberia,
Падает совсем не потому, а из-за использования WScript.Echo там где не надо. Вот так все нормально, хоть запускай через js, хоть через wsf
(function(that)
{
that.a = 1;
})(this);
WScript.Echo( a );
|
WScript - не JavaScript'овый объект, а WScript.Echo - не функция. Попробуйте, напр.
WScript.Echo( typeof WScript.Echo ); а WScript.Echo( typeof WScript ); или WScript.Echo( WScript.Echo instanceof Function ); вообще падают, чего (с точки зрения JavaScript) происходить не должно. |
Цитата:
var global=(function(){return this;})();
"use strict";
// и дальше все стрикт
|
Блин, что ж такое.
function test() { window.a = 1 alert(a) } alert(a) внутри функции выводит а снаружи нет.( |
Цитата:
(function(that)
{
that.a = function()
{
};
})(this);
a();
Понятно, что это искусственный пример, но он иллюстрирует проблему. |
with-love-from-siberia,
Ваша правда. Кста, так работает:
(function(that)
{
that.a = function()
{
WScript.Echo( "It works!" );
};
})(this);
a.call();
|
Здравствуйте. Понимаю - тема устарела, но все же. У меня похожий код. Нужно переменную socket сделать глобальной. Прошу помощи...
"use strict";
(function()
{
// ======== global vars from config ========
var srvaddress = url_base + 'include/socket/';//url каталога
var startserveraddress = srvaddress+'wsstart.php';
var chataddr = 'ws://localhost:8889';
// ======== private vars ========
var socket;
var xhttp;
////////////////////////////////////////////////////////////////////////////
var init = function()
{
//https://learn.javascript.ru/websockets Docs
socket = new WebSocket(chataddr + '/' + cookies + '/516616546465464');
socket.onopen = connectionOpen; //Соединение установлено
socket.onmessage = messageReceived; //Получены данные
//socket.onerror = errorOccurred;
//socket.onopen = connectionClosed;
document.getElementById("msg-send").onclick = function()
{
//sendMessage();
messagesend();
};
};
function messagesend()
{
}
function connectionOpen()
{
socket.send("{\"act\":\"start\", \"msg\":\"Connection with "+chataddr+". Подключение установлено обоюдно, отлично!\"}");
}
function messageReceived(e)
{
var json = eval("(" + e.data + ")");
}
function connectionClose() {
socket.close();
}
return{
// ---- onload event ----
load : function () {
window.addEventListener('load', function () {
init();
}, false);
}
}
})().load();
|
Ну так сотри var перед ней и она вылезет за пределы функции. Если там еще есть функция снаружи, то напиши явно window.socket= и далее по тексту. Ты же читал тему сначала или забил?
|
| Часовой пояс GMT +3, время: 12:01. |