JavaScript — програмски језик који је постао основа за читаву класу хибридних мобилних технологија. React Native, Ionic, Apache Cordova и многи други оквири омогућавају креирање мобилних апликација у JS-у, користећи јединствени стек технологија са веб развојем. JavaScript остаје најчешће коришћени програмски језик десету годину заредом према анкети Stack Overflow (2025). Детаљније погледајте у резултатима анкете Stack Overflow.
Главно
JavaScript (JS) — програмски језик високог нивоа са динамичким типизацијом, прототипским наслеђивањем и функцијама као објектима прве класе. Креирао га је Брендан Ајх 1995. године за 10 дана. Један је од три главна језика веб технологија (HTML, CSS, JS) и основа серверске платформе Node.js (2009), која је омогућила JS-у да изађе изван прегледача.
У мобилном развоју, JavaScript се користи у три парадигме: изворна компилација (React Native са Hermes/JSC), WebView контејнери (Ionic, Cordova) и серверски JS (Node.js + Express за бекенд мобилних апликација). React Native — доминантна технологија: према Statista (2025), 38% међуплатформских пројеката користи React Native, заостајући само за Flutter-ом (46%).
Кључна карактеристика JavaScript-а — једнонитни модел извршавања са неблокирајућим улазом-излазом. Event loop омогућава обраду хиљада асинхроних операција у једној нити без креирања нити оперативног система. То чини JS ефикасним за I/O-оптерећене апликације (мрежни захтеви, рад са базом података), али захтева опрез при CPU-интензивним прорачунима.
Стандард ECMAScript (ES) дефинише спецификацију JavaScript-а. ES6 (2015) увео је let/const, стреличасте функције, класе, модуле, Promise. ES2020 — Optional Chaining (?.), Nullish Coalescing (??). ES2023 — Array findLast, Hashbang Grammar. Савремени мотори Hermes (React Native) и V8 (Node.js) подржавају ES2022+. React Native Hermes подржава ES2020+ са одређеним ограничењима на Proxy и Symbol.
| Верзија ES | Година | Кључне функције | Подршка RN |
|---|---|---|---|
| ES6 | 2015 | let/const, Promise, class, modules, arrow functions | Потпуна |
| ES8 | 2017 | async/await, Object.entries | Потпуна |
| ES2020 | 2020 | Optional Chaining, Nullish Coalescing, BigInt | Потпуна |
| ES2022 | 2022 | Top-level await, .at(), Error Cause | Hermes ограничена |
Синтакса JavaScript — слична C-у, динамички типизирана. Тип променљиве одређује вредност и може се мењати у рантајму. let и const (ES6) заменили су var за блочни обим видљивости. Примитивни типови: string, number, boolean, null, undefined, symbol, bigint. Све остало је објекат (object, array, function, date, regexp).
JavaScript — језик са функцијама вишег реда. Функције се могу додељивати променљивима, прослеђивати као аргументи, враћати из других функција. Стреличасте функције (=>) немају свој this — оне наслеђују this из спољашњег контекста. Затварање (closure) — функција која памти променљиве из обима видљивости у којем је креирана.
// Типови података и функције у JavaScript
// Примитивни типови
const name = 'React Native';
let version = 0.71;
var isActive = true; // застарео var
// Објекти и низови
const app = {
platform: 'iOS',
version: 15,
getInfo() {
return `${this.platform} ${this.version}`;
}
};
const items = ['Dart', 'Kotlin', 'Swift'];
// Функција вишег реда
function filterByVersion(apps, minVersion) {
return apps.filter(app => app.version >= minVersion);
}
// Затварање (closure)
function createCounter() {
let count = 0;
return function() {
return ++count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
// Spread оператор за копирање објеката
const newApp = { ...app, version: 16 };Spread оператор ... креира плитку копију објекта. Деструктуризација (const { platform, version } = app) издваја поља у променљиве. Стреличаста функција у filterByVersion је краћа од function израза и не креира свој this — ово је критично у React Native компонентама, где this упућује на класу компоненте.
JavaScript користи прототипско наслеђивање, а не класно као Java или C#. Класе (ES6) — синтаксни шећер преко прототипова. Сваки објекат има унутрашњу референцу [[Prototype]] на други објекат. При приступу својству које не постоји у објекту, JS га тражи у ланцу прототипова. Класна синтакса (extends, super) чини код читљивијим, али испод хаубе остају прототипови.
// Класе у JavaScript — синтаксни шећер
class PlatformService {
// Приватно поље (ES2022)
#apiKey;
constructor(name, apiKey) {
this.name = name;
this.#apiKey = apiKey;
}
// Статички метод
static getPlatforms() {
return ['iOS', 'Android'];
}
// Гетер
get info() {
return `${this.name} SDK`;
}
// Асинхрони метод
async initialize() {
return await this.#validateKey();
}
#validateKey() {
return this.#apiKey.length > 10;
}
}
// Наслеђивање
class AndroidService extends PlatformService {
constructor(apiKey) {
super('Android', apiKey);
}
}Приватна поља #apiKey (ES2022) обезбеђују праву енкапсулацију, недоступну са _underscore конвенцијама. Статички метод getPlatforms припада класи, а не инстанци. Гетер info се израчунава при приступу. async/await чини асинхрони код линеарним. React Native Hermes подржава приватна поља од верзије 0.71.
Асинхроност JavaScript заснива се на event loop-у — бесконачној петљи која проверава стек позива (call stack) и редове задатака. Call stack — синхрони код, microtask queue — Promise.then/catch/finally, macrotask queue — setTimeout, setInterval, I/O. Event loop узима задатке прво из microtask, затим из macrotask. Блокирање call stack-а (бесконачна петља) зауставља цео UI.
Promise — објекат који представља будућу вредност. Promise може бити pending (чекање), fulfilled (успех), rejected (грешка). Ланац .then().catch().finally() обрађује асинхрони резултат. async/await (ES8) — синтаксни шећер: функција async враћа Promise, await суспендује извршење до разрешења promise-а, не блокирајући нит.
// Асинхроно учитавање података у React Native
import React, { useState, useEffect } from 'react';
import { View, Text, ActivityIndicator } from 'react-native';
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
let cancelled = false;
async function fetchUser() {
try {
const response = await fetch(
`https://api.example.com/users/${userId}`
);
if (!response.ok) {
throw new Error('Network error');
}
const data = await response.json();
if (!cancelled) {
setUser(data);
setLoading(false);
}
} catch (error) {
if (!cancelled) {
console.error('Fetch failed:', error);
setLoading(false);
}
}
}
fetchUser();
return () => { cancelled = true; };
}, [userId]);
if (loading) return <ActivityIndicator />;
return (
<View>
<Text>{user?.name ?? 'Unknown'}</Text>
</View>
);
}Хук useEffect са async функцијом fetchUser извршава HTTP захтев при монтирању компоненте. Заставица cancelled спречава setState након демонтирања — чест проблем у React Native-у. Optional Chaining user?.name и Nullish Coalescing ?? обрађују undefined без грешака. ActivityIndicator се приказује током учитавања — асинхрони образац познат сваком JS програмеру.
React Native — оквир од Meta (Facebook) за креирање изворних мобилних апликација у JavaScript-у. За разлику од WebView приступа, React Native рендерује праве изворне компоненте (UIView за iOS, ViewGroup за Android). JS код се извршава у посебној нити (Hermes или JSC) и комуницира са изворном UI нити преко Bridge-а (стара архитектура) или JSI-ја (нова архитектура Fabric).
React Native се састоји од JS нити (ваш код), изворне нити (UI) и Bridge/JSI за њихову интеракцију. У старој архитектури (Bridge) JSON поруке се серијализују и преносе асинхроно — то ствара кашњења при брзим анимацијама. Нова архитектура Fabric (React Native 0.68+) користи JSI (JavaScript Interface) — директну интеракцију JS-а са C++ објектима без серијализације.
// React Native компонента са изворним API-јем
import React, { useState, useEffect } from 'react';
import {
View, Text, TouchableOpacity, Platform,
PermissionsAndroid, Alert
} from 'react-native';
import Geolocation from '@react-native-community/geolocation';
function LocationTracker() {
const [location, setLocation] = useState(null);
useEffect(() => {
requestLocationPermission();
}, []);
async function requestLocationPermission() {
if (Platform.OS === 'android') {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION
);
if (granted !== PermissionsAndroid.RESULTS.GRANTED) {
Alert.alert('Permission denied');
return;
}
}
getCurrentPosition();
}
function getCurrentPosition() {
Geolocation.getCurrentPosition(
pos => setLocation({
lat: pos.coords.latitude,
lng: pos.coords.longitude
}),
error => Alert.alert('Error', error.message),
{ enableHighAccuracy: true, timeout: 15000 }
);
}
return (
<View>
<Text>Lat: {location?.lat ?? 'N/A'}</Text>
<Text>Lng: {location?.lng ?? 'N/A'}</Text>
<TouchableOpacity onPress={getCurrentPosition}>
<Text>Update Location</Text>
</TouchableOpacity>
</View>
);
}Компонента LocationTracker демонстрира рад са изворним API-јем геолокације. Platform.OS разликује Android и iOS. PermissionsAndroid.request — изворни дијалог дозвола Android-а. Geolocation.getCurrentPosition — модул @react-native-community/geolocation, повезан преко npm-а. React Native обезбеђује JS интерфејсе за камеру, Bluetooth, акцелерометар и друге сензоре.
Ionic — оквир за хибридне мобилне апликације, који користи WebView за рендеровање HTML/CSS/JS. За разлику од React Native-а, Ionic не креира изворне компоненте — апликација ради унутар веб контејнера (WebView) на iOS-у (WKWebView) и Android-у (Android WebView). Ово даје 100% поновну употребу веб кода, али ограничава перформансе сложених анимација.
Apache Cordova — основа Ionic-а, која обезбеђује приступ изворним API-јима кроз JavaScript додатке. Камера, GPS, контакти, систем датотека — све је доступно кроз cordova-plugin-*. Ionic 7+ користи Capacitor — наследника Cordova-е са бољим перформансама, подршком за ESM и директним приступом iOS/Android SDK-ју кроз Swift и Kotlin.
| Карактеристика | React Native | Ionic (Capacitor) | Cordova |
|---|---|---|---|
| Рендеровање UI | Изворне компоненте | WebView (WKWebView) | WebView |
| Језик | JS/TS | JS/TS + HTML/CSS | JS/TS + HTML/CSS |
| Изворни API | Bridge/JSI + модули | Capacitor Plugins | Cordova Plugins |
| Перформансе | Високе (60 FPS) | Средње (зависи од WebView) | Средње |
| Величина APK | ~25-40 MB | ~10-15 MB | ~8-12 MB |
| Поновна употреба | ~60% кода | ~95% кода са веб верзијом | ~95% |
Алати JS програмера за мобилне апликације укључују Node.js, npm/yarn, Expo, React Native CLI и Metro bundler. Node.js — окружење за извршавање JS-а изван прегледача, основа екосистема. npm (Node Package Manager) — менаџер пакета са 2+ милиона библиотека. npx — алат за покретање npm пакета без инсталације.
Expo — надградња над React Native-ом, која поједностављује развој: не захтева Xcode/Android Studio за почетак, пружа Managed Workflow са унапред инсталираним библиотекама. Expo Application Services (EAS) — изградња и објављивање у облаку. Metro — бандлер React Native-а, који сакупља JS код и зависности у један фајл. Hermes — JS мотор од Meta-е, оптимизован за мобилне уређаје са AOT компилацијом.
// package.json — конфигурација React Native пројекта
{
"name": "MyMobileApp",
"version": "1.0.0",
"scripts": {
"start": "npx react-native start",
"android": "npx react-native run-android",
"ios": "npx react-native run-ios",
"test": "jest",
"lint": "eslint . --ext .ts,.tsx"
},
"dependencies": {
"react": "^18.2.0",
"react-native": "^0.73.0",
"@react-navigation/native": "^6.1.0",
"@react-native-community/geolocation": "^3.2.0"
},
"devDependencies": {
"jest": "^29.7.0",
"eslint": "^8.56.0",
"metro-react-native-babel-preset": "^0.77.0"
}
}Фајл package.json — основа сваког JS пројекта. Скриптови start, android, ios покрећу Metro бандлер и изградњу. Зависности су подељене на dependencies (рантајм) и devDependencies (тестови, линтери). React Navigation — стандардни рутер. Jest — оквир за тестирање. ESLint — статички анализатор, који проверава стил кода и потенцијалне грешке.
Често постављана питања
JavaScript (JS) — програмски језик са динамичком типизацијом, прототипским наслеђивањем и једнонитним event loop моделом. Креиран 1995. године. У мобилном развоју користи се кроз React Native (изворне компоненте + JS логика) и Ionic (WebView контејнер). Најчешће коришћени језик десету годину заредом према Stack Overflow-у.
React Native извршава JS у посебној нити (Hermes или JSC). JS нит управља логиком и стањем, изворна нит рендерује UI компоненте. Размена података — преко Bridge-а (стара архитектура, JSON серијализација) или JSI-ја (нова архитектура Fabric, директан C++ приступ). Hermes — JS мотор од Meta-е са AOT компилацијом, који смањује време покретања за 50%.
JavaScript — динамички типизиран, типови се проверавају у рантајму. TypeScript додаје статичку типизацију са провером у фази компилације, интерфејсе, генерике и енумерације. Било који JS код је валидан у TypeScript-у. TS се компајлира (транспилира) у чисти JS кроз tsc или Babel. У React Native-у, TS се користи у ~65% нових пројеката.
Главни: React Native (Meta) — изворна рендеровање платформа са Bridge/Fabric. Ionic (Capacitor) — WebView контејнер са приступом изворним API-јима кроз додатке. Apache Cordova — претходник Ionic-а, такође WebView. NativeScript — директан приступ изворним API-јима без WebView-а. Expo — надградња над React Native-ом за брзо прототиповање без изворне изградње.
Асинхроност JS заснива се на event loop-у: call stack (синхрони код) → microtask queue (Promise.then) → macrotask queue (setTimeout, I/O). Promise — објекат за асинхроне операције. async/await — синтаксни шећер над Promise-ом. Једнонитни модел не блокира UI, али CPU-интензивни задаци захтевају Web Workers или посебну нит (у React Native-у — InteractionManager).
Завршни закључци
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.