Javascript не видит переменных
Во время работы сначала вызывается функция init, которая, казалось бы, должна инициализировать переменную settings, заданную во второй строке, но этого не происходит. При последующем вызове функции setColor выдаётся сообщение «settings is undefined». Почему? Ведь settings определена во внешней для init и setColor функции, значит, по правилам видимости Javascript, должна быть в них видима и доступна.
Если же задать какое-то начальное значение для settings, то при вызове init оно не меняется. Получается, что при вызове init в строке
settings = $.extend(<>, defaults, options);
создаётся новая переменная settings, Но почему?! И как сделать так, чтобы работала именно переменная settings, объявленная во второй строке данного фрагмента?
Переменная defaults определена во внешней функции, в которой определена приведённая функция. С defaults нет проблем — эта переменная видна и работает нормально..
maxapet,
чем не устроил рабочий вариант? и вас же просили делать полностью а не кусками
http://javascript.ru/forum/jquery/63. tml#post418937
В рабочем варианте settings, объявленная в функции init недоступна из функции setColor.
Я не понимаю, как связаны видимость переменной и css, например.
А вот идея с использованием data сработала, спасибо большое. 🙂
P.S. Проблема была в том, что переменная settings, объявленная как в приведённом примере, создаётся заново при каждом обращении к colorPicker.
в данном случае не хватало примера инициализации и остального кода скрипта.
если вы хотите именно так задавать вопрос то надо выкинуть всё лишнее , для локализации проблемы
будет примерно так:
$.fn.colorPicker = function(method)< var methods = < setColor: function(color) < >, init: function(options) < return this.each(function(i,el)< var settings = $.extend(<>, defaults, options); //как сделать обьект settings сделать доступным в методе setColor для каждого el >); > > // немного магии if ( methods[method] ) < // если запрашиваемый метод существует, мы его вызываем // все параметры, кроме имени метода придут в метод // this так же перекочует в метод return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 )); >else if ( typeof method === 'object' || ! method ) < // если первым параметром идет объект, либо совсем пусто // выполняем метод init return methods.init.apply( this, arguments ); >else < // если ничего не получилось $.error( 'Метод "' + method + '" не найден в плагине jQuery.colorPicker' ); >>
Javascript не видит переменных
Добрый день. Вопрос детский, но я только в начале пути.
Если переменную mytime создать внутри функции, сделать локальной, то функция sec() её видит. Но, если вынести, как в приведённом мною примере кода, функция sec() не видит её. Объясните пожалуйста принцип.
var myTime = document.getElementById("mySecund"); var 1000); var counter = 0; function sec()
Вы, похоже, просто скрипт не правильно размещаете.
всё работает.
"utf-8"> Time: "mySecund">unknown "text/javascript"> var myTime = document.getElementById("mySecund"); var 1000); var counter = 0; function sec()
Да. Скрипт у меня в head. Ок. Обясните тогда, пожалуйста, почему так происходит?
Т.е. если у меня скрипт лежит в head. Какая разница, переменная внтури функции или вне её объявляется и в неё передаются данные.
парсер страницы увидел скрипт — парсер скрипт запустил, но до твоего элемента он еще не дошел и не создал
Всё же лучше скрипты располагать в head. Для корректной работы надо поставить слушатель на событие окончания постройки DOM, после чего к последнему можно будет обращаться:
document.addEventListener('DOMContentLoaded', function() < var myTime = document.getElementById("mySecund"); var 1000); var counter = 0; function sec() < counter++; myTime.innerHTML = "Секунд прошло - " + counter; if (counter == 10) clearInterval(id); >>);
мммм. тогда какая разница. Я просто не понимаю сам процесс. Я понимаю, что скрипт идёт раньше.
Я просто не понимаю, в чём разница, переменная создана за функцией или внутри её. В одном и том же случае скрипт располагается одинаково. Но если переменная вне функции, она её не видит, а если внутри — тогда видит
Потому что функция `sec` запускается через секунду — к этому времени скорее всего браузер уже успеет построить DOM (но гарантировать это нельзя).
Яваскрипт видит вашу переменную. Он просто не может выполнить document.getElementById(«mySecund») , поскольку к моменту выполнения скрипта этот элемент ещё не существует в DOM (браузер его ещё не нарисовал) .
Вызов скрипта/функции должен идти по HTML-коду ниже вашего , или запускаться по событию окончания загрузки страницы (формирования DOM)
Курсы javascript
с этим разобрался, там я j забыл обнулить после прохождения внутреннего цикла, но вот еще одна проблема: в переменную distance записывается число внутри функции, но после функции в цикле я его не могу вывести, потому что его уже нету. Вот код:
for(j;j); var result = < mas: centroids[i]['object'], point: points[j]['point'], distance: distance >; console.log(result); >
Как мне правильно записать, чтобы то число с функции можно было вывести после нее в цикле?
for(j;j; console.log(result); >); >)(i,j) >
спасибо, я б такое со своими знаниями в js не сделал
еще вопросик: можно ли передать координаты в обьект не как массив с двух элементов как сделано тут
ymaps.route([centroids[a]['point'], points[b]['point']])
for(j;j; console.log(result); >); >)(i,j) >
Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object
Dark19,
потому что асинхронность когда у сервера есть возможность тогда и отвечает — 1 запрос скажем обрабатывался 100ms а второй 10ms — в результате ответ на второй пришёл быстрее ответа на первый.
Node.js — имортируемая функция не видит переменные в текущей области видимости, решение?
Добрый день. Я тестировщик, осваиваю автоматизацию.
В js и nodejs новичок.
Есть файл с блоками тестов. Пытаюсь вынести постоянно повторяющиеся действия за пределы исходного файла дабы уменьшить количество кода. Но что-то идет не так.
Вынесенные действия:
exports.loadRegistrationForm = function() < driver.get('http. '); driver.getTitle().then(function(title)< if(". "===title)< driver.findElement(webdriver.By.xpath('html/body/div/header/div/div/div[2]/div[2]/a[1]')) .click(); >; >); driver.wait(function()< return driver.isElementPresent(webdriver.By.name('fos_user_registration_form[email]')); >, 3000, 'Failed to load Registration form'); >; // заполнение формы регистрации и проверка соответствия exports.fillingRegistrationForm = function(inputEmail, inputPassword, errElement, errMessage)< driver.findElement(webdriver.By.name('fos_user_registration_form[email]')) .sendKeys(inputEmail); //вводим уже зарегистрированный email driver.findElement(webdriver.By.name('fos_user_registration_form[plainPassword]')) .sendKeys(inputPassword); //вводим валидный пароль driver.findElement(webdriver.By.id('btn-submit')).click();//сабмит driver.wait(function()< return driver.isElementPresent(webdriver.By.xpath(errElement)); >, 3000, 'Элемент не найден'); //ожидание загрузки текста ошибки var flow = webdriver.promise.controlFlow(); function getErrObject() < errObject = driver.findElement(webdriver.By.xpath(errElement)) .getText() >//берем объект элемента с текстом ошибки flow.execute(getErrObject).then(function()< if(errObject.value_ === errMessage)< assert.equal(errObject.value_, errMessage); console.log('OK') >; >); >;
var assert = require("assert") var webdriver = require('selenium-webdriver'); var driver = new webdriver.Builder(). withCapabilities(webdriver.Capabilities.chrome()). build(); var loadRegistrationForm = require('./reusable_function').loadRegistrationForm; var fillingRegistrationForm = require('./reusable_function').fillingRegistrationForm; describe('Проверка поля Email формы регистрации.', function()< it('Ввод уже зарегистрированного Email', function(done)< var inputEmail = '123@ya.ru'; var inputPassword = '12345678Aa'; var errElement = "//*[@class='form-errors server-error']"; var errMessage = 'Email уже используется'; loadRegistrationForm(); //загружаем форму регистрации fillingRegistrationForm(inputEmail, inputPassword, errElement, errMessage); return done(); >); >);
C:\Program Files\nodejs\test\reusable_function.js:9 driver.get('http://. '); ^ ReferenceError: driver is not defined at Object.exports.loadRegistrationForm (C:\Program Files\nodejs\test\reusabl e_function.js:9:5) at Object. (C:\Program Files\nodejs\test\test2_mocha.js:7:32) at Module._compile (module.js:435:26) at Object.Module._extensions..js (module.js:442:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:311:12) at Module.require (module.js:366:17) at require (module.js:385:17) at C:\Users\Valentine11\AppData\Roaming\npm\node_modules\mocha\lib\mocha.js: 216:27 at Array.forEach (native) at Mocha.loadFiles (C:\Users\Valentine11\AppData\Roaming\npm\node_modules\mo cha\lib\mocha.js:213:14) at Mocha.run (C:\Users\Valentine11\AppData\Roaming\npm\node_modules\mocha\li b\mocha.js:453:10) at Object. (C:\Users\Valentine11\AppData\Roaming\npm\node_modules \mocha\bin\_mocha:393:18) at Module._compile (module.js:435:26) at Object.Module._extensions..js (module.js:442:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:311:12) at Function.Module.runMain (module.js:467:10) at startup (node.js:136:18) at node.js:963:3
Т.е. не находит переменную driver.
Вопрос: почему? Может быть, я как-то не так подгружаю функции?
Решение из поста: Node.js. Подгрузка файла в текущее окружение не работает.
Если убрать ; в строчках 6 и 7, то ту же самую ошибку выдает уже сам mocha:
Проверка поля Email формы регистрации. 1) Ввод уже зарегистрированного Email 0 passing (41ms) 1 failing 1) Проверка поля Email формы регистрации. Ввод уже зарегистрированного Email: ReferenceError: driver is not defined at exports.loadRegistrationForm (C:\Program Files\nodejs\test\reusable_fun ction.js:9:5) at Context. (C:\Program Files\nodejs\test\test2_mocha.js:15:9) at callFnAsync (C:\Users\Valentine11\AppData\Roaming\npm\node_modules\moch a\lib\runnable.js:306:8) at Test.Runnable.run (C:\Users\Valentine11\AppData\Roaming\npm\node_module s\mocha\lib\runnable.js:261:7) at Runner.runTest (C:\Users\Valentine11\AppData\Roaming\npm\node_modules\m ocha\lib\runner.js:421:10) at C:\Users\Valentine11\AppData\Roaming\npm\node_modules\mocha\lib\runner. js:528:12 at next (C:\Users\Valentine11\AppData\Roaming\npm\node_modules\mocha\lib\r unner.js:341:14) at C:\Users\Valentine11\AppData\Roaming\npm\node_modules\mocha\lib\runner. js:351:7 at next (C:\Users\Valentine11\AppData\Roaming\npm\node_modules\mocha\lib\r unner.js:283:14) at Immediate._onImmediate (C:\Users\Valentine11\AppData\Roaming\npm\node_m odules\mocha\lib\runner.js:319:5)
Не пишу пока первоначальный код, т.к. считаю, что он тут в принципе не нужен, и не хочется превращать вопрос в простыню. но если надо — добавлю. Заранее спасибо за ответы.
—
UPD. Ошибку с драйвером убрала пока, указав driver в файле с вынесенными функциями. Мне не нравится это решение но пусть пока так.
Сейчас код выглядит следующим образом:
var assert = require("assert") var webdriver = require('selenium-webdriver'); var driver = new webdriver.Builder(). withCapabilities(webdriver.Capabilities.chrome()). build(); var flow = webdriver.promise.controlFlow(); loadRegistrationForm = require('./reusable_function').loadRegistrationForm fillingRegistrationForm = require('./reusable_function').fillingRegistrationForm describe('Проверка поля Email формы регистрации.', function()< it('Ввод уже зарегистрированного Email', function(done)< var inputEmail = '123@ya.ru'; var inputPassword = '12345678Aa'; var errElement = "//*[@class='form-errors server-error']"; var errMessage = 'Email уже используется'; loadRegistrationForm(); fillingRegistrationForm(inputEmail, inputPassword, errElement, errMessage); flow.execute(function()< return done(); >); >); >);
Код работает, тест выполняется. НО! скрипт открывает два окна браузера, т.к. при импорте инициализируется драйвер, это напрягает. Если убрать инициализацию драйвера, в файле с тестами опять выдается driver is not defined. Т.е. по сути, проблема, вынесенная в заголовок, осталась.
Также непонятно, почему код работоспособен, только если импортировать как Function Declaration:
loadRegistrationForm = require(‘./reusable_function’).loadRegistrationForm
fillingRegistrationForm = require(‘./reusable_function’).fillingRegistrationForm?
Во всех примерах используется импорт через var.
Почему код неработоспособен, если в импортируемых функциях ставить module.export, а не просто export, тоже неясно.
Курсы javascript
с этим разобрался, там я j забыл обнулить после прохождения внутреннего цикла, но вот еще одна проблема: в переменную distance записывается число внутри функции, но после функции в цикле я его не могу вывести, потому что его уже нету. Вот код:
for(j;j); var result = < mas: centroids[i]['object'], point: points[j]['point'], distance: distance >; console.log(result); >
Как мне правильно записать, чтобы то число с функции можно было вывести после нее в цикле?
for(j;j; console.log(result); >); >)(i,j) >
спасибо, я б такое со своими знаниями в js не сделал
еще вопросик: можно ли передать координаты в обьект не как массив с двух элементов как сделано тут
ymaps.route([centroids[a]['point'], points[b]['point']])
for(j;j; console.log(result); >); >)(i,j) >
Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object map.js:79 Object
Dark19,
потому что асинхронность когда у сервера есть возможность тогда и отвечает — 1 запрос скажем обрабатывался 100ms а второй 10ms — в результате ответ на второй пришёл быстрее ответа на первый.