Nano Hash - криптовалюты, майнинг, программирование

javascript передает переменные eval

У меня есть функция eval, которая должна выполнять javascript из php. но мне нужно передать элемент, чтобы я мог навести указатель мыши на подсказку по ссылке, по которой щелкнул пользователь.

var globalEval = function globalEval(src, element) {
        if (window.execScript) {
            window.execScript(src);
            return;
        }
        var fn = function(element) {
            window.eval.call(window,src);
        };
        fn(element);
    };

Я использую следующий способ передать элемент $(this)

globalEval(js_code, $(this));
// js_code is = alert(element);

я получаю ошибку неопределенного элемента, который определен в globalEval();, как я могу это исправить?


  • Если я прав, полагая, что src всегда является строкой, что произойдет, если вы сделаете window.eval.call(window,'(function (element) {'+src+'})')(element);? 17.12.2012
  • @PaulS. хорошо, я попробую и отправлю ответ. 17.12.2012

Ответы:


1

Это проблема области видимости, поскольку глобальный eval не вызывает код в той же области, что и переменная element. Если вам необходимо использовать eval, хотя eval - это зло, вам придется делать это таким образом, чтобы вы могли вызывать свой код в нужной среде. Один из способов сделать это - обернуть ее как анонимную функцию, которой вы задаете параметры для выбранных переменных среды.

Например

window.eval.call(window,'(function (element) {'+src+'})')(element);

Это означает, что строка src анализируется, но не вызывается eval, поскольку она возвращает анонимную функцию. Затем вы вызываете его, передавая свои данные, в данном случае element.

Протестируйте это с помощью var element = document.body, src = 'console.log(element.tagName)';, и вы увидите "BODY" в журнале. Обратите внимание: если вы хотите установить глобальные переменные (или функции) таким образом, они должны быть явно указаны как глобальные (window.foobar = ...), иначе они будут GCd после завершения анонимной функции.

16.12.2012
  • Почему не только местный eval(src), он бы забрал element 17.12.2012
  • @Esailija Потому что мне нравится все усложнять. Нет, способ в моем ответе означает, что вы указываете среду с помощью передачи переменных и защищаете свою текущую среду (поскольку функция - ByVal, изменение, такое как element = otherElm, не влияет на то место, где вы его вызвали), тогда как локальный eval(src) будет использовать текущую среду. Есть и другие варианты его вызова (например, изменение / использование .call). Я не говорю, что eval когда-либо безопасно, но, по крайней мере, этот способ означает, что вы можете вызывать в нужной среде (при условии, что src является допустимым JavaScript). 17.12.2012
  • @PaulS. Большое спасибо. теперь это отлично работает :). кстати, это также будет работать window.execScript ('(function (element) {' + src + '})') (element); ? 17.12.2012
  • Вместо этого вам следует использовать конструктор функций: он сообщает (синтаксис) ошибки лучше. 17.12.2012
  • @geocar +1, потому что я согласен, но это не связано с eval, что не является вопросом OP. 17.12.2012
  • @PaulS. что вы предлагаете по использованию? eval или конструктор функции, а если конструктор функции, будет ли какая-то разница или что-то может перестать работать в функции или динамическом коде javascript из php? 17.12.2012
  • @Basit Я бы по возможности избегал eval. Как я уже упоминал в своем ответе, eval - это зло. В лучшем случае вам не следует передавать какой-либо скрипт для вызова таким образом (как я думаю, как упоминалось Esailija?), А передавать только данные (например, как JSON) 17.12.2012
  • @PaulS. но поддерживается ли новая функция () в старых браузерах? 17.12.2012
  • new Function поддерживается во всех основных браузерах и должен будет поддерживаться в IE обратно в IE6. 17.12.2012
  • @PaulS. Большое спасибо за помощь. возник вопрос о совместимости с браузером, потому что я в документации Firefox сказал? ?, так что я волновался. но спасибо. 17.12.2012

  • 2

    Если все, что вы хотите сделать, это установить this при оценке некоторого кода, попробуйте:

    // Code you want to evaluate
    var code = 'return this.whatever'
    
    // What you want "this" bound to:
    var that = { whatever: 69 }
    
    // Now do this:
    var result = new Function(code).call(that)
    

    Использование конструктора Function означает, что вы получите то, что ожидаете; Глобальный eval сопровождает множество вещей, некоторые из которых могут вас удивить. Лучше избегать этого, если он вам не нужен.

    Теперь, если вы действительно хотите назвать это element, Конструктор функций тоже может это сделать:

    code = 'alert(element)'
    var use_element = 69
    result = new Function("element", code).call(this, use_element)
    
    16.12.2012
  • мне нравится ваше предложение. просто интересно, поддерживается ли он старыми браузерами и будет ли какой-либо динамический код javascript из php нормально выполняться без ошибок? 17.12.2012
  • @Basit - См. aptana.com/reference/api/Function.html для совместимости с браузером. . PHP в него не входит, вы можете просто сделать что-то вроде: result = new Function("element", <?= json_encode($code) ?>).call(this, use_element), если хотите. 20.12.2012

  • 3

    если функция обратного вызова находится в том же домене, то установите глобальную переменную как репо перед eval, которая сохранит эту переменную. затем используйте глобальную переменную в функции, которую вы собираетесь вызвать.

    var response_repo;
    function someFunc($callback){
     ....
     success: function(result) {
                response_repo = result;
                eval($callback+'();');
            },
     ....
     }
    
    
     callBackFunc(){
      $data=response_repo;
     }
    
    31.01.2021
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..